source: codes/icosagcm/trunk/src/initial/etat0_database.f90 @ 709

Last change on this file since 709 was 709, checked in by ymipsl, 6 years ago

OpenMP fix when creating intial state from files by interpolation (etat0_database).

Missing synchronisation when using openMP parallelisation on vertical levels.

YM

File size: 5.0 KB
Line 
1MODULE etat0_database_mod
2
3
4CONTAINS
5
6  SUBROUTINE init_etat0
7  USE xios_mod
8  USE omp_para
9  IMPLICIT NONE
10 
11    IF (is_omp_master) THEN
12      CALL xios_set_fieldgroup_attr("read_fields",enabled=.TRUE.)
13      CALL xios_set_filegroup_attr("read_files",enabled=.TRUE.)
14    ENDIF
15  END SUBROUTINE init_etat0
16
17  SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u, f_q)
18  USE icosa
19  USE restart_mod
20  USE wind_mod
21  USE write_field_mod
22  USE time_mod
23  USE transfert_mod
24  USE xios_mod
25  USE write_field_mod
26  USE vertical_remap_mod
27  USE theta2theta_rhodz_mod
28  USE qsat_mod
29  USE pression_mod
30  USE omp_para
31  IMPLICIT NONE
32    TYPE(t_field),POINTER :: f_ps(:)
33    TYPE(t_field),POINTER :: f_phis(:)
34    TYPE(t_field),POINTER :: f_theta_rhodz(:)
35    TYPE(t_field),POINTER :: f_u(:)
36    TYPE(t_field),POINTER :: f_q(:)
37
38    TYPE(t_field),POINTER,SAVE :: f_ulon_reg(:)
39    TYPE(t_field),POINTER,SAVE :: f_ulat_reg(:)
40    TYPE(t_field),POINTER,SAVE :: f_temp_reg(:)
41    TYPE(t_field),POINTER,SAVE :: f_q_reg(:)
42
43    TYPE(t_field),POINTER,SAVE :: f_ts(:)
44    TYPE(t_field),POINTER,SAVE :: f_z(:)
45    TYPE(t_field),POINTER,SAVE :: f_ulon(:)
46    TYPE(t_field),POINTER,SAVE :: f_ulat(:)
47    TYPE(t_field),POINTER,SAVE :: f_temp(:)
48    TYPE(t_field),POINTER,SAVE :: f_q1(:)
49    TYPE(t_field),POINTER,SAVE :: f_qsat(:)
50    TYPE(t_field),POINTER,SAVE :: f_p(:)
51    INTEGER :: nb_level
52    REAL,ALLOCATABLE:: levels(:)
53    INTEGER :: ind
54
55    CALL xios_read_field("relief_db",f_phis)
56   
57    CALL writeField("relief_out",f_phis,once=.TRUE.)
58
59    IF (is_omp_level_master) THEN
60      DO ind=1,ndomain
61        IF (.NOT. assigned_domain(ind)) CYCLE
62        f_phis(ind)%rval2d(:)=f_phis(ind)%rval2d(:)*g     
63      ENDDO
64    ENDIF
65!$OMP BARRIER   
66
67    IF (is_omp_master) CALL xios_get_axis_attr("lev_ecdyn",n_glo=nb_level)
68    CALL bcast_omp(nb_level)
69    ALLOCATE(levels(nb_level))
70
71    IF (is_omp_master) CALL xios_get_axis_attr("lev_ecdyn",value=levels)
72    CALL bcast_omp(levels)
73   
74    levels=levels*100  ! hectoPascal -> Pascal
75 
76    CALL allocate_field(f_ts, field_t, type_real, name="ts")
77    CALL allocate_field(f_z, field_t, type_real, name="z")
78    CALL allocate_field(f_ulon_reg, field_t, type_real,nb_level)
79    CALL allocate_field(f_ulat_reg, field_t, type_real,nb_level)
80    CALL allocate_field(f_temp_reg, field_t, type_real,nb_level)
81    CALL allocate_field(f_q_reg,    field_t, type_real,nb_level)
82   
83    CALL allocate_field(f_q1,    field_t, type_real,llm)
84    CALL allocate_field(f_qsat,  field_t, type_real,llm)
85    CALL allocate_field(f_p,  field_t, type_real,llm+1)
86    CALL allocate_field(f_temp,  field_t, type_real,llm)
87    CALL allocate_field(f_ulon,  field_t, type_real,llm)
88    CALL allocate_field(f_ulat,  field_t, type_real,llm)
89
90    CALL xios_read_field("z_db",f_z)
91    CALL xios_read_field("ps_db",f_ps)
92    CALL xios_read_field("ts_db",f_ts)
93    CALL writeField("ps_out",f_ps)
94
95!$OMP BARRIER
96   
97!    CALL writeField("phis_out",f_phis,once=.TRUE.)
98!    CALL writeField("ts_out",f_ts,once=.TRUE.)
99
100! make correction to ps due to relief at higher resolution
101! difference with LMDZ : tsol is taken from ECDYN.NC and not from ECPHY
102    IF (is_omp_level_master) THEN
103      DO ind=1,ndomain
104        IF (.NOT. assigned_domain(ind)) CYCLE
105        f_ps(ind)%rval2d(:)=f_ps(ind)%rval2d(:)*(1.+(f_z(ind)%rval2d(:)-f_phis(ind)%rval2d(:))/287.0/f_ts(ind)%rval2d(:))
106      ENDDO
107    ENDIF
108!$OMP BARRIER   
109    CALL transfert_request(f_ps,req_i0) 
110    CALL writeField("ps_out",f_ps)
111   
112   
113
114    CALL xios_read_field("temp_db",f_temp_reg)
115    CALL vertical_remap(levels,f_temp_reg,f_ps,f_temp)
116    CALL transfert_request(f_temp,req_i0) 
117    CALL temperature2theta_rhodz(f_ps,f_temp,f_theta_rhodz)
118
119    CALL xios_read_field("u_db",f_ulon_reg)
120    CALL vertical_remap(levels,f_ulon_reg,f_ps,f_ulon)
121    CALL xios_read_field("v_db",f_ulat_reg)
122    CALL vertical_remap(levels,f_ulat_reg,f_ps,f_ulat)
123    CALL transfert_request(f_ulat,req_i0) 
124    CALL transfert_request(f_ulon,req_i0) 
125    CALL ulonlat2un(f_ulon, f_ulat,f_u)
126
127    CALL xios_read_field("q_db",f_q_reg)
128    CALL vertical_remap(levels,f_q_reg,f_ps,f_q1)
129
130    CALL pression(f_ps,f_p)
131! difference with LMDZ : for qsat, pressure at mid layer is computed as a mean value pmid=(p(l)+p(l+1))/2   
132    CALL qsat(f_temp,f_p,f_qsat)
133    CALL transfert_request(f_qsat,req_i0) 
134
135    DO ind=1,ndomain
136      IF (.NOT. assigned_domain(ind)) CYCLE
137      f_q(ind)%rval4d(:,:,:)=1e-6
138      f_q(ind)%rval4d(:,:,1)=f_q1(ind)%rval3d(:,:)*f_qsat(ind)%rval3d(:,:)*0.01
139      WHERE(f_q(ind)%rval4d(:,:,1)<0) f_q(ind)%rval4d(:,:,1)=0
140    ENDDO
141
142    CALL writeField("tempdb_out",f_temp_reg)
143    CALL writeField("temp_out",f_temp)
144
145    CALL deallocate_field(f_ts)
146    CALL deallocate_field(f_z)
147    CALL deallocate_field(f_ulon_reg)
148    CALL deallocate_field(f_ulat_reg)
149    CALL deallocate_field(f_temp_reg)
150    CALL deallocate_field(f_q_reg)
151   
152    CALL deallocate_field(f_q1)
153    CALL deallocate_field(f_qsat)
154    CALL deallocate_field(f_p)
155    CALL deallocate_field(f_temp)
156    CALL deallocate_field(f_ulon)
157    CALL deallocate_field(f_ulat)   
158 
159  END SUBROUTINE etat0
160
161END MODULE etat0_database_mod
Note: See TracBrowser for help on using the repository browser.