jagomart
digital resources
picture1_Fortran Pdf 188200 | 01ipst118


 146x       Filetype PDF       File size 0.06 MB       Source: www.ipstconf.org


File: Fortran Pdf 188200 | 01ipst118
a fortran 95 implementation of emtp algorithms 1 2 2 3 4 jean mahseredjian benoit bressac alain xemard luc gerin lajoie pierre jean lagace 1 ireq hydro quebec 2 electricite ...

icon picture PDF Filetype PDF | Posted on 02 Feb 2023 | 2 years ago
Partial capture of text on file.
                      
                      
                                             A Fortran-95 implementation of EMTP algorithms 
                                                        1                 2                2                   3                     4 
                                     Jean Mahseredjian , Benoît Bressac , Alain Xémard , Luc Gérin-Lajoie , Pierre-Jean Lagacé  
                      (1)IREQ / Hydro-Québec             (2)Électricité de France             (3) TransÉnergie,            (4)École de Technologie 
                         1800 Lionel-Boulet              Direction des Études et          Hydro-Québec, Complexe                  Supérieure 
                         Varennes, Québec,                     Recherches                         Desjardins,              1100 Notre Dame Ouest 
                          Canada, J3X 1S1             1 ave. du Général de Gaulle            CP 10000, Montréal,                  Montréal,  
                                                          92141 Clamart Cedex                 Canada, H5B 1H7                 Canada, H3C 1K3 
                                                                      
                                                                                       numerical and historical reasons Fortran is still considered 
                     Abstract - This paper presents a complete Fortran-95 based        as the language of computational science and kept on 
                     implementation of EMTP type algorithms. It demonstrates           surviving in the midst of new and modern languages.  
                     software engineering advantages and proposes formulations             Although several modern language concepts and 
                     and programming designs most suitable for  transient              constructs can be imitated in Fortran-77, it remains a 
                     analysis computations in Fortran-95. Computing                    strongly handicapped language in several aspects and more 
                     performance is compared against Fortran-77 usage. The             fundamentally in dynamic data allocation, parallelism and 
                     coding experience presented in this paper demonstrates that       programming safety. Fortran-77 is not an object -oriented 
                     Fortran-95 is not just a logical upgrade from Fortran-77, it      language, it is behind C and C++ for data abstraction and it 
                     is a modern and powerful language and should be even              lacks recursion and data structures.  
                     considered as the preferred language choice for large scale           It requires a major investment and strong justifications 
                     transient analysis application development.                       to rewrite an existing large scale Fotran-77 application with 
                                                                                       a modern and significantly different computer language, 
                         Keywords: Software engineering, EMTP, Fortran                 such as C/C++. Automatic translators are unable to 
                                                                                       maintain the original conceptual thinking and usually create 
                                         I. INTRODUCTION                               code maintenance problems.  Experience has shown that 
                                                                                       manual conversion of Fortran legacy code into C/C++ is a 
                         This paper presents an experience in software                 extensive task, there are also concerns about reported poor 
                     engineering for programming EMTP (Electromagnetic                 performance.  
                     Transients Program)  [1] type algorithms. Although the                Although some of Fortran-77 features are becoming 
                     presented material is related to transients, offered ideas and    obsolescent and may completely disappear in a future 
                     experiments are applicable to other power system analysis         language revision cycle, the new Fortran-95  [3][4] 
                     applications.                                                     standard stays fully backward compatible with Fortran-77. 
                         There are several software engineering considerations         Fortran-95 is also a modernized language most suitable for 
                     in recoding or writing from scratch a large scale power           numerically intensive applications. These are the main 
                     system application. The most important consideration is the       reasons why a natural and cost effective transition from 
                     choice of the programming language. The programming               Fortran-77 is Fortran-95. Nevertheless, the coding 
                     language plays a predominant role in the software                 experience presented in this paper demonstrates that 
                     engineering cycle. An advanced language can provide               Fortran-95 is not just a logical upgrade, it is a modern and 
                     means for fast translation of mathematical formulations           powerful language and should be even considered as the 
                     into actual code. The ultimate combination is very high-          preferred language choice for power system transient 
                     level programming resulting in extremely efficient code.          analysis application development. Additionally, there is 
                     Although interpreter based languages (such as [2]) or visual      also a migration path to parallel computers, since High 
                     design environments can become very powerful, they are            Performance Fortran is also based on Fortran-95. 
                     still unable to achieve the computational speed provided by 
                     compiler based languages. Automatic compiler based code                       II. FORTRAN-95 ADVANTAGES 
                     generation from high-level languages, lacks  specialization 
                     and has difficulties replicating conceptual thinking for the          The most useful new features of Fortran-95 for EMTP 
                     most efficient coding path.                                       algorithms are grouped into “array building and 
                         Increasing problem complexity requires more powerful          manipulation” and “data abstraction”. The first group 
                     constructs and syntax in a computer language. In the past         includes dynamic memory allocation, data parallelism, 
                     twenty years, computer science has progressed dramatically        array sections and array operations. The second group 
                     and spurred interest on the use of new programming                includes derived data types, programming with modules 
                     languages such as PASCAL, ADA and most notably                    (hiding, scope and encapsulation), interface definition and 
                     C/C++ and now Java.                                               operator or function overloading.  
                         Large scale transient analysis applications have been             For the rest of this paper, the Fotran-95 version of 
                     traditionally coded and maintained using almost                   EMTP will be referred to as EMTP-F95. 
                     exclusively the Fortran-77 language. Fortran-77 has been 
                     standardized in 1978. Its dominance in all fields of 
                     numerical computations has kept increasing as new and 
                     highly optimizing compilers became available. For 
                                                                            1/6 
                     
                     
                    A. Modularity                                                    using derived data types, those that have been exploited in 
                        There are several programming language features that         EMTP-F95 are code readability, simplified access to data 
                    are useful in the programming and maintenance of large           and memory management.  
                    codes. Modularity is among the most important features.             The following lines of code, extracted from the Zinc 
                         The code that modifies data for a component, must be        Oxide (ZnO) arrester model, are presented to illustrate some 
                    localized and confined to a related location in the program,     of the above concepts. 
                    and not spread throughout the entire code. This is what is       MODULE zno_branch 
                                                                                       USE input_data 
                    meant by encapsulation. It goes beyond the definition of           USE plot_memory  !to transmit outputs 
                    function or subroutine by allowing all related operations          USE service 
                    (methods) to be grouped around a defined data type. It shall       USE sparse_main_mat, & 
                    be allowed to hide data and methods. Fotran-95 allows                  ONLY: put, putnonl, fill, & 
                                                                                           Vaug, Vaug_c, n_Ynonlin, Inonlin 
                    encapsulation and information hiding. Fortran-95 has the           USE all_purpose, ONLY: int2str,angle 
                    notion of scope. Scope means that an internal function             INCLUDE 'default_header.f90' 
                                                                                     TYPE, PRIVATE:: zno_str 
                    (FUNCTION or SUBROUTINE)  is within its host's scope              REAL(krealhp)  :: Rss    ! steady-state R 
                    and therefore has access to all the host's entities with the      REAL(krealhp)  :: Vref   ! reference voltage 
                    ability to call other internally defined functions. External      REAL(krealhp)  :: Vflash ! flashover voltage 
                                                                                      INTEGER        :: loc    ! locator in char 
                    functions can be called from anywhere and contain internal        INTEGER        :: knode  ! left node vector 
                    procedures.                                                       INTEGER        :: mnode  ! right node vector 
                        Fortran-95 has introduced the module unit. It is used for     REAL(krealhp)  :: Iq=zero  !Norton current source 
                    data encapsulation and global data. The generic form of a         REAL(krealhp)  :: G=zero   !Norion admittance 
                                                                                      REAL(krealhp)  :: i        !element current 
                    module is                                                              
                    MODULE module-name                                                REAL(krealhp)  :: vkm=zero !voltage  
                    [specification construct]                                         INTEGER :: state=0  !flashover state 
                    [ CONTAINS ]                                                      INTEGER :: segnow=0  !operating segment at t 
                    [subprogram]                                                      INTEGER :: lastseg=0 !operating segment at t-Dt 
                    END [MODULE [module-name] ]                                       
                    Language keywords are in bold (in this paper) characters to       REAL(krealhp) :: tol=1e-6_krealhp;  
                                                                                     END TYPE zno_str 
                    enhance visualization. A module can be accessed by                  
                    another program unit using                                       TYPE, PRIVATE:: zno_char 
                    USE module-name                                                   REAL(krealhp),  POINTER,DIMENSION(:) :: p  !ZnO p 
                                                                                      REAL(krealhp),  POINTER,DIMENSION(:) :: q !Zno q  
                    Modules permit specifying private and public attributes for            (krealhp),             ,           (:) :: V !min  
                                                                                      REAL               POINTER DIMENSION
                    data and functions. An interface block can be used to             REAL(krealhp),  POINTER,DIMENSION(:) :: vpast  
                    provide an explicit interface to module procedures.              END TYPE zno_char 
                    Functions placed in a module are automatically checked for                   ………………………………… 
                                                                                          (zno_str),  & 
                                                                                     TYPE
                    the number of arguments and for argument types by the                DIMENSION(:), ALLOCATABLE, PRIVATE :: Zno 
                    compiler. It is a very important safety feature in Fortran-95.   TYPE(zno_char), & 
                        To be more specific, all EMTP components can be                  DIMENSION(:), ALLOCATABLE, PRIVATE :: Znoch 
                    contained in  separate and completely detachable modules.                    ………………………………… 
                                                                                     CONTAINS 
                    The list of components includes network element models             SUBROUTINE znomod(ido) 
                    and program procedures for network solutions and                    INTEGER      :: k,i,j,jj 
                    input/output operations.                                            CHARACTER(LEN=*) ido 
                        Module usage dictates the design of EMTP-F95 code. A            REAL(krealhp) :: vnew,iguess,vguess 
                                                                                              ………………………………… 
                    completely modular architecture is created by using a core          todocall : SELECT CASE (ido) 
                    code capable of handling all the required solution methods          CASE('initialize') !* initialization procs 
                    and interacting with network components (models) only                     ………………………………… 
                                                                                        CASE('put_nodes_in_Yaug') !*symbolic data 
                    through a specific set of communication protocols, called                 ………………………………… 
                    request signals. Components react by sending back                   CASE DEFAULT 
                    participation data. Each component module is completely             RETURN 
                    encapsulated and based on “case” selectors. Each case               END SELECT todocall 
                                                                                        RETURN   
                    being a response section for the received request.                 END SUBROUTINE znomod 
                        Modules are also very useful in the development project      END MODULE zno_branch 
                    of a large scale application; programmers can work in            The following lines are explanatory remarks for the above 
                    parallel for coding separate modules by strictly defined         code sample. 
                    interfacing with the core code only.                                The chosen convention in EMTP-F95 is to use upper 
                                                                                     case only letters for language keywords. Code variables are 
                    B. Derived types                                                 based on lower case letters, but it is allowed to use capital 
                        Encapsulation and information hiding allows defining         letters for increased visibility of some variables, such as the 
                    derived (abstract) data types. A derived type is a user          data holder structures. Fortran-95 is not case-sensitive by 
                    defined type built up from intrinsic types and previously        itself. Lines or inline sections starting with an exclamation 
                    defined derived types. There are several advantages in           mark indicate a comment. The character  & is the 
                                                                                     continuation character. 
                                                                         2/6 
                      
                      
                        The  USE statement requests visibility within the             A structure can also contain separately allocatable fields, in 
                     module’s scope of public names (data and functions)              Fortran-95 they must be declared with the  POINTER 
                     available in external modules. Here the ZnO model is using       attribute. This is useful, when, as in Znoch, the fields of 
                     data and functions from several modules. It is allowed to        the derived data type are not of the same length. The choice 
                     limit accessibility using the ONLY statement, as is the case     of structures and related fields is motivated by code 
                     for the  sparse_main_mat module usage. In this                   vectorization possibilities available for their usage.  
                     example, only the put, putnonl and  fill methods 
                     (functions), and only the variables  Vaug,  Vaug_c,              D. Overloading 
                     n_Ynonlin and  Inonlin can be accessed from                          Some component case sections must be designed to 
                     zno_branch. Limited accessibility limits global memory           reply to the core code using predefined functions available 
                     usage and provides increased modularity.                         from the core code. Here are, for example, the  CASE 
                        A derived type (structure) is created by the type             sections used by the RLC component for sending its 
                     declaration keyword  TYPE. It is allowed to initialize data      equations into the core code’s system of equations: 
                     fields in the derived type creator. Initialization is either a        ('put_in_Yn_ss')  
                                                                                      CASE
                     number or a previously defined variable. This component is         RLC%gz=RLC%R+jz*(w*RLC%L- RLC%C/w); !jz=sqrt(-1) 
                     designed using 3 structures:  Zno,  Znoch and  Znopar              RLC%gz=inv_vector(RLC%gz); !1/RLC%gz, 0 when 0  
                     (not shown). Since Zno and Znopar must hold data for all           DO k=1,SIZE(RLC) 
                                                                                          CALL fill(RLC(k)%knode,RLC(k)%knode,RLC(k)%gz) 
                     arresters in the solved case, it is necessary to declare them        ………………………………… 
                     as  ALLOCATABLE. Memory allocation issues are                      END DO 
                     discussed in a following paragraph.                                  ………………………………… 
                                                                                      CASE('put_in_Yn')   
                        The PRIVATE keyword hides data and functions from               DO k=1,SIZE(RLC) 
                     other modules capable of connecting to this module                   CALL fill(RLC(k)%knode,RLC(k)%knode,RLC(k)%g) 
                     through a USE statement. Procedures in other modules can                   ………………………………… 
                     never impact on declared private parts.                            END DO  
                        Fortran-95 allows controlling precision using                 The fill function transmits required data into the large 
                     predefined variables in the declaration statement. In the        system matrix. It is an overloaded function, capable of 
                     above real number declarations  krealhp indicates the            handling both complex (for steady-state) and real (for time-
                     highest precision available. It is defined in the                domain) systems of equations. Function overloading refers 
                     default_precision module. A single line of code                  to using the same function name, but performing different 
                     change is thus needed to change precision in the entire          operations based on argument type. In addition to function 
                     program. The module  default_precision is not                    overloading it is allowed to define operator overloading. 
                     explicitly referenced in the zno_branch. That is due to          These are new and powerful coding options in Fortran-95, 
                     the fact that using a module provides automatic access to        since Fortran-77 allowed overloading only for intrinsic 
                     the modules it is using. In this case                            functions and data types. To construct a generic  fill 
                     default_precision is used by out_saver, which is                 function it is necessary to place an interface statement in 
                     used by input_data. The USE feature is tricky. Chained           the sparse_main_mat module: 
                                                                                      INTERFACE fill 
                     USE statements can create loops. They can also sophisticate           MODULE PROCEDURE fill_c,fill_r 
                     relations between modules even when carefully designed.          END INTERFACE 
                        The core code can only access the subroutine znomod           Interface functions fill_c and fill_r are separately 
                     through a call using  a request keyword. Each request            defined. The compiler automatically calls  fill_r or 
                     keyword is handled in a separate CASE section when the           fill_c depending on the type of the third argument in 
                     component must participate (reply) to that request.              fill usage, real or complex respectively. A similar design 
                                                                                      is applicable to the function  inv_vector used in the 
                     C. Memory allocation                                             above RLC example. 
                        Fortran-95 alleviates a major limitation of Fortran-77            In Fortran-95 it is required to provide the overloading 
                     by allowing standard memory allocations and deallocation         function (method) for all possible variations in input 
                     calls. An allocatable vector (or array) must be declared with    arguments. If a method is defined for a derived type used as 
                     using the ALLOCATABLE keyword. Fortran-95 also allows            a vector, it must be also defined for the same derived type 
                     dynamic arrays. Dynamic arrays are used only inside the          used as a scalar. When scalar and vector combinations are 
                     procedure, they are created on procedure entry and               considered and a total of na arguments are used, a total of 
                     destroyed on procedure exit. Arrays in Fortran-95 can be         2na methods must be defined. This is true even if 
                     viewed as objects with data and size information.                sometimes the underlying codes can be identical. The best 
                     Subroutine variables are defaulted to automatic.                 demonstration of this statement is given by the  angle 
                        To allocate the entire Zno structure for n arresters in       function used for finding the angle of a complex number or 
                     one statement, it is required  to use:                           vector. Its interface is defined  in the EMTP-F95 
                     ALLOCATE(Zno(n),  STAT=j); %j flags memory error                 all_purpose module: 
                     To access the fields of  Zno it is needed to use the  %          INTERFACE angle 
                     symbol, such as:                                                      MODULE PROCEDURE angle_real,angle_vector 
                                                                                           
                                                                                      END INTERFACE 
                     Zno(i)%vkm=vguess;                                               The function angle_real is given by: 
                                                                          3/6 
                      
                      
                     FUNCTION angle_real(phasor)                                             Another example of high-level coding with arrays is the 
                      COMPLEX(krealhp) :: phasor                                         usage of locator and extractor functions. In this example it 
                      REAL(krealhp) :: angle_real                                        is desired to find the operating segment in the nonlinear 
                      angle_real=&                                                       arrester model for a given voltage condition. Here is how it 
                      ATAN2(AIMAG(phasor),REAL(phasor))*rad2deg; 
                     END FUNCTION angle_real                                             is expressed in Fortran-95 
                     The function angle_vector is given by:                              j=Zno(i)%loc+Zno(i)%state;             
                                                                                         d=MAXLOC(Znoch(j)%V,& 
                                                                                                  MASK=ABS(Zno(i)%vkm)>Znoch(j)%V);  
                                                                                         Zno(i)%segnow=d(1);  
                                                                                         The  MAXLOC statement uses a conditional mask for 
                     FUNCTION angle_vector(phasor)                                       locating the operating segment in a characteristic vector 
                      COMPLEX(krealhp), DIMENSION(:) :: phasor                           situated by the pointer j. 
                           (krealhp),& 
                       REAL                                                                  The solution method for nonlinear branches in EMTP-
                      DIMENSION(SIZE(phasor)):: angle_vector                             F95 is an iterative process where each nonlinear component 
                      angle_vector=&                                                     is represented by a Norton equivalent. To avoid numerical 
                      ATAN2(AIMAG(phasor),REAL(phasor))*rad2deg;                         problems it is necessary to save and refresh the sections of  
                     END FUNCTION angle_vector                                           the sparse matrix  Yaug where nonlinear branches are 
                     The only difference between  angle_real and                         connected. This is achieved in a single statement in the 
                     angle_vector is in the declaration of arguments. It is              code lines shown below. Since the original size of 
                     achieved by noticing that in Fortran-95 intrinsic functions         Ynonlin (the memory refresh matrix) is overallocated, it 
                     are overloaded to handle arrays. Some other noteworthy              is necessary to pick-up the maximum number of cells using 
                     features appearing in the above example are: the variable           the actual size given by n_Ynonlin. 
                     rad2deg is obtained from the scope of the module                    Yaug(Ynonlin(1:n_Ynonlin)%j)%value= & 
                     all_purpose;  the intrinsic  SIZE function allows                   Ynonlin(1:n_Ynonlin)%value;  
                     declaring data of the same size as the input argument.              Inonlin=zero; VaugOld=Vaug; !reset 
                     E. Vectorization and high-level coding                              The last line of this code is for  resetting the entire vector 
                                                                                         Inonlin and saving the previous iteration solution in 
                         Vectorization is another key ingredient for  high-level         Vaugold.  
                     constructs. Native operators and functions in Fortran-95 are 
                     readily overloaded for handling vectors and matrices. Such          F. Object oriented programming  
                     overloading and the ability to access array sections,                   Fortran-95 is not a fully object oriented language. It is 
                     provides means for vectorized and high-level coding in              however feasible and practical to adopt OOP (Object 
                     EMTP-F95. Some examples are given below.                            Oriented Programming) in Fortran-95. Almost all features 
                         The first statement for  RLC%gz in the above RLC                of C++ can be reproduced directly or emulated in Fortran-
                     example is able to act on all RLC branches through a single         95. Fortran-95 has the notion of class through modules. It 
                     line of code. DO loops can be avoided in these cases. More          supports inheritance since derived types can be made of 
                     sophistication is apparent in the computation of RLC                other types and create a derived class built upon the base 
                     branch current at a given time-point:                               class methods. Fortran-95 is directly capable of static 
                     RLC%i_at_t=RLC%g* &                                                 polymorphism using the INTERFACE block construct. The 
                               (Vaug(RLC%knode)-Vaug(RLC%mnode))+RLC%h                   most significant exception is runtime polymorphism 
                         The vector Vaug is the solution vector, it contains node        (dynamic dispatching)  since its emulation requires more 
                     voltages for the entire system. Using   effort. 
                     Vaug(RLC%knode) finds the vector of all left node                       It is not obvious to decide on how to improve 
                     voltages for all RLC branches only.                                 productivity through OOP. Experiments demonstrated that 
                         High-level coding in EMTP requires advanced                     full OOP for this type of application can create a cryptic 
                     functions for searching in arrays. Fortran-95 has built-in          code and drastically lack performance. That is why, even 
                     functions for testing conditions on arrays. The statements          though many of OOP ideas were retained, the OOP 
                     below are extracted from the ideal switch code.                     programming p aradigm was not adopted. 
                     WHERE( (Sw0%newstatus==0) .AND. (Sw0%status==1) )  
                           !test current for this condition 
                       WHERE( (ABS(Vaug(iloc+Sw0%in)) 
						
									
										
									
																
													
					
The words contained in this file might help you see if this file matches what you are looking for:

...A fortran implementation of emtp algorithms jean mahseredjian benoit bressac alain xemard luc gerin lajoie pierre lagace ireq hydro quebec electricite de france transenergie ecole technologie lionel boulet direction des etudes et complexe superieure varennes recherches desjardins notre dame ouest canada jx s ave du general gaulle cp montreal clamart cedex hb h hc k numerical and historical reasons is still considered abstract this paper presents complete based as the language computational science kept on type it demonstrates surviving in midst new modern languages software engineering advantages proposes formulations although several concepts programming designs most suitable for transient constructs can be imitated remains analysis computations computing strongly handicapped aspects more performance compared against usage fundamentally dynamic data allocation parallelism coding experience presented that safety not an object oriented just logical upgrade from behind c abstraction powe...

no reviews yet
Please Login to review.