1 | MODULE info_PEM_mod |
---|
2 | |
---|
3 | implicit none |
---|
4 | |
---|
5 | integer :: iPCM, iPEM, nPCM, nPCM_ini ! Data about the chained simulation of PCM/PEM runs |
---|
6 | |
---|
7 | !======================================================================= |
---|
8 | contains |
---|
9 | !======================================================================= |
---|
10 | |
---|
11 | SUBROUTINE 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 | |
---|
21 | use time_evol_mod, only: convert_years, year_bp_ini |
---|
22 | |
---|
23 | implicit none |
---|
24 | |
---|
25 | !----- Arguments |
---|
26 | integer, intent(in) :: stopPEM ! Reason to stop |
---|
27 | real, intent(in) :: i_myear_leg ! # of years |
---|
28 | real, intent(in) :: i_myear, n_myear ! Current simulated Martian year and maximum number of Martian years to be simulated |
---|
29 | |
---|
30 | !----- Local variables |
---|
31 | logical :: ok |
---|
32 | integer :: cstat |
---|
33 | character(50) :: info_frmt |
---|
34 | character(20) :: ich1, ich2, ich3, ich4, fch1, fch2, fch3 |
---|
35 | |
---|
36 | !----- Code |
---|
37 | inquire(file = 'info_PEM.txt',exist = ok) |
---|
38 | if (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 | info_frmt = '(f'//int2str(nb_digits(year_bp_ini + i_myear) + 5)//'.4,'//'f'//int2str(nb_digits(i_myear_leg) + 5)//'.4,'//'f'//int2str(nb_digits(i_myear) + 5)//'.4,'//'i0)' |
---|
56 | write(1,trim(adjustl(info_frmt))) year_bp_ini + i_myear, i_myear_leg, i_myear, stopPEM |
---|
57 | close(1) |
---|
58 | else |
---|
59 | error stop 'The file ''info_PEM.txt'' does not exist and cannot be updated!' |
---|
60 | endif |
---|
61 | |
---|
62 | END SUBROUTINE info_PEM |
---|
63 | |
---|
64 | !======================================================================= |
---|
65 | |
---|
66 | FUNCTION int2str(i) RESULT(str) |
---|
67 | ! Function to convert an integer into a string |
---|
68 | |
---|
69 | integer, intent(in) :: i |
---|
70 | character(20) :: str |
---|
71 | |
---|
72 | if (nb_digits(real(i)) > len(str)) error stop 'int2str [info_PEM_mod]: invalid integer for conversion!' |
---|
73 | write(str,'(i0)') i |
---|
74 | str = trim(adjustl(str)) |
---|
75 | |
---|
76 | END FUNCTION int2str |
---|
77 | |
---|
78 | !======================================================================= |
---|
79 | |
---|
80 | FUNCTION nb_digits(x) RESULT(idigits) |
---|
81 | ! Function to give the number of digits for the integer part of a real number |
---|
82 | |
---|
83 | real, intent(in) :: x |
---|
84 | integer :: idigits |
---|
85 | |
---|
86 | idigits = 1 |
---|
87 | ! If x /= 0 then: |
---|
88 | if (abs(x) > 1.e-10) idigits = int(log10(abs(x))) + 1 |
---|
89 | |
---|
90 | END FUNCTION nb_digits |
---|
91 | |
---|
92 | END MODULE info_PEM_mod |
---|