source: trunk/LMDZ.COMMON/libf/evolution/info_PEM_mod.F90 @ 3512

Last change on this file since 3512 was 3512, checked in by jbclement, 11 days ago

PEM:
Few corrections related to r3498 (time step from integer to real) and r3493 (Norbert Schorghofer's subroutines for dynamic ice table) in order to make the code work properly.
JBC

File size: 3.2 KB
Line 
1MODULE info_PEM_mod
2
3implicit none
4
5integer :: iPCM, iPEM, nPCM, nPCM_ini ! Data about the chained simulation of PCM/PEM runs
6
7!=======================================================================
8contains
9!=======================================================================
10
11SUBROUTINE info_PEM(i_myear_leg,stopPEM,i_myear,n_myear)
12
13!=======================================================================
14!
15! Purpose: Update the first line of "info_PEM.txt" to count the number of simulated Martian years
16!          Write in "info_PEM.txt" the reason why the PEM stopped and the number of simulated years
17!
18! Author: RV, JBC
19!=======================================================================
20
21use time_evol_mod, only: convert_years, year_bp_ini
22
23implicit none
24
25!----- Arguments
26integer, intent(in) :: stopPEM          ! Reason to stop
27real,    intent(in) :: i_myear_leg      ! # of years
28real,    intent(in) :: i_myear, n_myear ! Current simulated Martian year and maximum number of Martian years to be simulated
29
30!----- Local variables
31logical       :: ok
32integer       :: cstat
33character(10) :: frmt
34character(20) :: ich1, ich2, ich3, ich4, fch1, fch2, fch3
35
36!----- Code
37inquire(file = 'info_PEM.txt',exist = ok)
38if (ok) then
39    write(fch1,'(f'//int2str(nb_digits(i_myear) + 5)//'.4)') i_myear
40    write(fch2,'(f'//int2str(nb_digits(n_myear) + 5)//'.4)') n_myear
41    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"
42    write(ich1,'(i0)') iPCM
43    write(ich2,'(i0)') iPEM + 1
44    write(ich3,'(i0)') nPCM
45    write(ich4,'(i0)') nPCM_ini
46    call execute_command_line('sed -i "1s/.*/'//trim(fch1)//' '//trim(fch2)//' '//trim(fch3)//' '//trim(ich1)//' '//trim(ich2)//' '//trim(ich3)//' '//trim(ich4)//'/" info_PEM.txt',cmdstat = cstat)
47    if (cstat > 0) then
48        error stop 'info_PEM: command execution failed!'
49    else if (cstat < 0) then
50        error stop 'info_PEM: command execution not supported!'
51    endif
52    open(1,file = 'info_PEM.txt',status = "old",position = "append",action = "write")
53    ! 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
54    ! The conversion ratio from Planetary years to Earth years is given in the header of the file
55    write(1,*) year_bp_ini + i_myear, i_myear_leg, i_myear, stopPEM
56    close(1)
57else
58    error stop 'The file ''info_PEM.txt'' does not exist and cannot be updated!'
59endif
60
61END SUBROUTINE info_PEM
62
63!=======================================================================
64
65FUNCTION int2str(i) RESULT(str)
66! Function to convert an integer into a string
67
68integer, intent(in) :: i
69character(20)       :: str
70
71if (nb_digits(real(i)) > len(str)) error stop 'int2str [info_PEM_mod]: invalid integer for conversion!'
72write(str,'(i0)') i
73str = trim(adjustl(str))
74
75END FUNCTION int2str
76
77!=======================================================================
78
79FUNCTION nb_digits(x) RESULT(idigits)
80! Function to give the number of digits for the integer part of a real number
81
82real, intent(in) :: x
83integer          :: idigits
84
85idigits = 1
86! If x /= 0 then:
87if (abs(x) > 1.e-10) idigits = int(log10(abs(x))) + 1
88
89END FUNCTION nb_digits
90
91END MODULE info_PEM_mod
Note: See TracBrowser for help on using the repository browser.