source: trunk/LMDZ.COMMON/libf/evolution/info_pem.F90 @ 4050

Last change on this file since 4050 was 3991, checked in by jbclement, 4 months ago

PEM:
Apply documentation template everywhere: standardized headers format with short description, separators between functions/subroutines, normalized code sections, aligned dependencies/arguments/variables declaration.
JBC

File size: 4.7 KB
RevLine 
[3989]1MODULE info_pem
[3991]2!-----------------------------------------------------------------------
3! NAME
4!     info_pem
5!
6! DESCRIPTION
7!     Handles counters for PCM/PEM coupled runs and simulation metadata.
8!
9! AUTHORS & DATE
10!     R. Vandemeulebrouck
11!     JB Clement, 2023-2025
12!
13! NOTES
14!
15!-----------------------------------------------------------------------
[3076]16
[3991]17! DECLARATION
18! -----------
[3076]19implicit none
20
[3991]21! MODULE VARIABLES
22! ----------------
[3349]23integer :: iPCM, iPEM, nPCM, nPCM_ini ! Data about the chained simulation of PCM/PEM runs
24
[3076]25contains
[3991]26!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
27
[3076]28!=======================================================================
[3989]29SUBROUTINE update_info(i_myear_leg,stopPEM,i_myear,nyears_tot)
[3991]30!-----------------------------------------------------------------------
31! NAME
32!    update_info
[2980]33!
[3991]34! DESCRIPTION
35!    Update the first line of "launchPEM.info" to count the number of
36!    simulated Martian years. Write in "launchPEM.info" the reason why
37!    the PEM stopped and the number of simulated years.
[2980]38!
[3991]39! AUTHORS & DATE
40!    R. Vandemeulebrouck
41!    JB Clement, 2023-2025
42!
43! NOTES
44!
45!-----------------------------------------------------------------------
[2980]46
[3991]47! DEPENDENCIES
48! ------------
[3989]49use evolution, only: convert_years, year_bp_ini
[2886]50
[3991]51! DECLARATION
52! -----------
[3076]53implicit none
[2886]54
[3991]55! ARGUMENTS
56! ---------
57integer, intent(in) :: stopPEM     ! Reason to stop
58real,    intent(in) :: i_myear_leg ! # of years
59real,    intent(in) :: i_myear     ! Current simulated Martian year
60real,    intent(in) :: nyears_tot  ! Maximum number of Martian years to be simulated
[2886]61
[3991]62! LOCAL VARIABLES
63! ---------------
[3096]64logical       :: ok
65integer       :: cstat
[3533]66character(20) :: fch1, fch2, fch3
[2886]67
[3991]68! CODE
69! ----
[3980]70inquire(file = 'launchPEM.info',exist = ok)
[3039]71if (ok) then
[3512]72    write(fch1,'(f'//int2str(nb_digits(i_myear) + 5)//'.4)') i_myear
[3989]73    write(fch2,'(f'//int2str(nb_digits(nyears_tot) + 5)//'.4)') nyears_tot
[3512]74    write(fch3,'(f6.4)') convert_years ! 4 digits to the right of the decimal point to respect the precision of Martian year in "launch_pem.sh"
[3980]75    call execute_command_line('sed -i "1s/.*/'//trim(fch1)//' '//trim(fch2)//' '//trim(fch3)//' '//int2str(iPCM)//' '//int2str(iPEM + 1)//' '//int2str(nPCM)//' '//int2str(nPCM_ini)//'/" launchPEM.info',cmdstat = cstat)
[3096]76    if (cstat > 0) then
[3989]77        error stop 'update_info: command execution failed!'
[3096]78    else if (cstat < 0) then
[3989]79        error stop 'update_info: command execution not supported!'
[3096]80    endif
[3980]81    open(1,file = 'launchPEM.info',status = "old",position = "append",action = "write")
[3173]82    ! Martian date, Number of Martians years done by the PEM run, Number of Martians years done by the chainded simulation, Code of the stopping criterion
83    ! The conversion ratio from Planetary years to Earth years is given in the header of the file
[3533]84    write(1,'(f20.4,f20.4,f20.4,i20)') year_bp_ini + i_myear, i_myear_leg, i_myear, stopPEM
[3096]85    close(1)
[3039]86else
[3980]87    error stop 'The file ''launchPEM.info'' does not exist and cannot be updated!'
[3039]88endif
89
[3989]90END SUBROUTINE update_info
[3991]91!=======================================================================
[3039]92
[3512]93!=======================================================================
94FUNCTION int2str(i) RESULT(str)
[3991]95!-----------------------------------------------------------------------
96! NAME
97!     int2str
98!
99! DESCRIPTION
100!     Convert an integer into a string.
101!
102! AUTHORS & DATE
103!     JB Clement, 2023-2025
104!
105! NOTES
106!
107!-----------------------------------------------------------------------
[3512]108
[3991]109! DECLARATION
110! -----------
111implicit none
112
113! ARGUMENTS
114! ---------
115integer, intent(in) :: i
116
117! LOCAL VARIABLES
118! ---------------
[3533]119character(20)             :: str_tmp
120character(:), allocatable :: str
[3512]121
[3991]122! CODE
123! ----
[3989]124if (nb_digits(real(i)) > len(str_tmp)) error stop 'int2str [info_pem]: invalid integer for conversion!'
[3533]125write(str_tmp,'(i0)') i
126str = trim(adjustl(str_tmp))
[3512]127
128END FUNCTION int2str
[3991]129!=======================================================================
[3512]130
131!=======================================================================
132FUNCTION nb_digits(x) RESULT(idigits)
[3991]133!-----------------------------------------------------------------------
134! NAME
135!     nb_digits
136!
137! DESCRIPTION
138!     Give the number of digits for the integer part of a real number.
139!
140! AUTHORS & DATE
141!     JB Clement, 2023-2025
142!
143! NOTES
144!
145!-----------------------------------------------------------------------
[3512]146
[3991]147! DECLARATION
148! -----------
149implicit none
150
151! ARGUMENTS
152! ---------
[3512]153real, intent(in) :: x
154
[3991]155! LOCAL VARIABLES
156! ---------------
157integer :: idigits
158
159! CODE
160! ----
[3512]161idigits = 1
162! If x /= 0 then:
163if (abs(x) > 1.e-10) idigits = int(log10(abs(x))) + 1
164
165END FUNCTION nb_digits
[3991]166!=======================================================================
[3512]167
[3989]168END MODULE info_pem
Note: See TracBrowser for help on using the repository browser.