Line 
Branch 
Exec 
Source 
1 


! $Id$ 
2 


module press_coefoz_m 
3 



4 


implicit none 
5 



6 


real, pointer, save:: plev(:) 
7 


! (pressure level of Mobidic input data, converted to Pa, in strictly 
8 


! ascending order) 
9 



10 


real, allocatable, save:: press_in_edg(:) 
11 


! (edges of pressure intervals for Mobidic input data, in Pa, in strictly 
12 


! ascending order) 
13 



14 


contains 
15 



16 

✗ 
subroutine press_coefoz 
17 



18 


! This procedure is called once per "gcm" run. 
19 


! A single thread of the root process reads the pressure levels 
20 


! from "coefoz_LMDZ.nc" and broadcasts them to the other processes. 
21 



22 


! We assume that, in "coefoz_LMDZ.nc", the pressure levels are in hPa 
23 


! and in strictly ascending order. 
24 



25 


use netcdf95, only: nf95_open, nf95_close, nf95_gw_var, nf95_inq_varid 
26 


use netcdf, only: nf90_nowrite 
27 



28 


use mod_phys_lmdz_mpi_data, only: is_mpi_root 
29 


use mod_phys_lmdz_mpi_transfert, only: bcast_mpi ! broadcast 
30 



31 


! Variables local to the procedure: 
32 


integer ncid, varid ! for NetCDF 
33 


integer n_plev ! number of pressure levels in the input data 
34 


integer k 
35 



36 


! 
37 



38 


!$omp single 
39 

✗ 
print *, "Call sequence information: press_coefoz" 
40 



41 

✗ 
if (is_mpi_root) then 
42 

✗ 
call nf95_open("coefoz_LMDZ.nc", nf90_nowrite, ncid) 
43 



44 

✗ 
call nf95_inq_varid(ncid, "plev", varid) 
45 

✗ 
call nf95_gw_var(ncid, varid, plev) 
46 


! Convert from hPa to Pa because "paprs" and "pplay" are in Pa: 
47 

✗ 
plev = plev * 100. 
48 

✗ 
n_plev = size(plev) 
49 



50 

✗ 
call nf95_close(ncid) 
51 


end if 
52 



53 

✗ 
call bcast_mpi(n_plev) 
54 

✗ 
if (.not. is_mpi_root) allocate(plev(n_plev)) 
55 

✗ 
call bcast_mpi(plev) 
56 



57 


! Compute edges of pressure intervals: 
58 

✗ 
allocate(press_in_edg(n_plev + 1)) 
59 

✗ 
if (is_mpi_root) then 
60 

✗ 
press_in_edg(1) = 0. 
61 


! We choose edges halfway in logarithm: 
62 

✗ 
DO k = 2,n_plev 
63 

✗ 
press_in_edg(k) = SQRT(plev(k  1) * plev(k)) 
64 


ENDDO 
65 

✗ 
press_in_edg(n_plev + 1) = huge(0.) 
66 


! (infinity, but any value guaranteed to be greater than the 
67 


! surface pressure would do) 
68 


end if 
69 

✗ 
call bcast_mpi(press_in_edg) 
70 


!$omp end single 
71 



72 

✗ 
end subroutine press_coefoz 
73 



74 


end module press_coefoz_m 
75 


