lpjg_forcing_ifs.F90 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953
  1. program LPJGFORC
  2. ! reading from NetCDF files and passing the data to OASIS
  3. ! units for the climatic parameters:
  4. ! temperature (K)
  5. ! precipitation (m s-1)
  6. ! radiation (W m-2)
  7. ! Previous update: 10 Dec 2015 - add 2 new fields for low veg. - see "ecev3"
  8. ! Now reads AMIP output.
  9. ! Last update: Nov. 2017 (Etienne Tourigny) - update indentation, add namelist for several parameters
  10. ! and sync with latest changes in ESM branch (from r4521)
  11. use mod_oasis
  12. use mpi
  13. implicit none
  14. ! integer,parameter :: MAXGRID = 35718
  15. integer,parameter :: MAXGRID = 88838
  16. integer,parameter :: t_max_year = 365
  17. integer,parameter :: t_max_leap = 366
  18. ! integer,parameter :: num_years = 10
  19. ! integer,parameter :: start_year = 1850
  20. ! integer,parameter :: num_loops = 10
  21. integer :: num_years,start_year,num_loops
  22. ! character(len=*),parameter::nc_file_path="./ifs_data/"
  23. character(len=1024) :: nc_file_path
  24. character(len=*),parameter::nc_file_tail="_dayavg.nc"
  25. namelist /NAMLPJGFORC/ num_years,start_year,num_loops,nc_file_path
  26. character(len=*),parameter :: NamelistFileName = "namelist.lpjg_forcing"
  27. integer,parameter :: NAMLPJGFORCU = 999
  28. logical :: LPJGFORCnotFree
  29. character(len=6),parameter :: model_name = "LPJGFORC"
  30. double precision :: minhlai,maxhlai,minllai,maxllai
  31. double precision :: meanhlai,meanllai,meanvegl,meanvegh
  32. double precision :: maxcvh,maxcvl,maxtvl,maxtvh,cover
  33. ! PM, was SPATEMPE, SPAPRECI, SPARADIA, SPATOLAI
  34. character(len=128),parameter :: f_temp_name = "T2MVeg"
  35. integer :: f_temp_id = -77
  36. double precision :: f_temp_data(MAXGRID,1)
  37. character(len=128),parameter :: f_prec_name = "TPVeg"
  38. integer :: f_prec_id = -77
  39. double precision :: f_prec_data(MAXGRID,1)
  40. double precision :: f_precs_data(MAXGRID,1)
  41. double precision :: f_precc_data(MAXGRID,1)
  42. double precision :: f_snowfall_data(MAXGRID,1)
  43. ! character(len=128),parameter :: f_vegl_name = "CVLVeg"
  44. ! integer :: f_vegl_id = -77
  45. ! double precision :: f_vegl_data(MAXGRID,1)
  46. ! character(len=128),parameter :: f_vegltype_name = "TVLVeg"
  47. ! integer :: f_vegltype_id = -77
  48. ! double precision :: f_vegltype_data(MAXGRID,1)
  49. ! character(len=128),parameter :: f_vegh_name = "CVHVeg"
  50. ! integer :: f_vegh_id = -77
  51. ! double precision :: f_vegh_data(MAXGRID,1)
  52. character(len=128),parameter :: f_snoc_name = "SDVeg"
  53. integer :: f_snoc_id = -77
  54. double precision :: f_snoc_data(MAXGRID,1)
  55. character(len=128),parameter :: f_snod_name = "SDensVeg"
  56. integer :: f_snod_id = -77
  57. double precision :: f_snod_data(MAXGRID,1)
  58. character(len=128),parameter :: f_st1l_name = "SoilTVeg.L001"
  59. integer :: f_st1l_id = -77
  60. double precision :: f_st1l_data(MAXGRID,1)
  61. character(len=128),parameter :: f_st2l_name = "SoilTVeg.L002"
  62. integer :: f_st2l_id = -77
  63. double precision :: f_st2l_data(MAXGRID,1)
  64. character(len=128),parameter :: f_st3l_name = "SoilTVeg.L003"
  65. integer :: f_st3l_id = -77
  66. double precision :: f_st3l_data(MAXGRID,1)
  67. character(len=128),parameter :: f_st4l_name = "SoilTVeg.L004"
  68. integer :: f_st4l_id = -77
  69. double precision :: f_st4l_data(MAXGRID,1)
  70. character(len=128),parameter :: f_sm1l_name = "SoilMVeg.L001"
  71. integer :: f_sm1l_id = -77
  72. double precision :: f_sm1l_data(MAXGRID,1)
  73. character(len=128),parameter :: f_sm2l_name = "SoilMVeg.L002"
  74. integer :: f_sm2l_id = -77
  75. double precision :: f_sm2l_data(MAXGRID,1)
  76. character(len=128),parameter :: f_sm3l_name = "SoilMVeg.L003"
  77. integer :: f_sm3l_id = -77
  78. double precision :: f_sm3l_data(MAXGRID,1)
  79. character(len=128),parameter :: f_sm4l_name = "SoilMVeg.L004"
  80. integer :: f_sm4l_id = -77
  81. double precision :: f_sm4l_data(MAXGRID,1)
  82. character(len=128),parameter :: f_rads_name = "SSRVeg"
  83. integer :: f_rads_id = -77
  84. double precision :: f_rads_data(MAXGRID,1)
  85. character(len=128),parameter :: f_radl_name = "SLRVeg"
  86. integer :: f_radl_id = -77
  87. double precision :: f_radl_data(MAXGRID,1)
  88. character(len=128),parameter :: f_llai_name = "LAILVeg"
  89. integer :: f_llai_id = -77
  90. double precision :: f_llai_data(MAXGRID,1)
  91. character(len=128),parameter :: f_hlai_name = "LAIHVeg"
  92. integer :: f_hlai_id = -77
  93. double precision :: f_hlai_data(MAXGRID,1)
  94. character(len=128),parameter :: f_typh_name = "TypeHVeg"
  95. integer :: f_typh_id = -77
  96. double precision :: f_typh_data(MAXGRID,1)
  97. character(len=128),parameter :: f_vggh_name = "FracHVeg"
  98. integer :: f_vggh_id = -77
  99. double precision :: f_vggh_data(MAXGRID,1)
  100. ! ecev3
  101. character(len=128),parameter :: f_typl_name = "TypeLVeg"
  102. integer :: f_typl_id = -77
  103. double precision :: f_typl_data(MAXGRID,1)
  104. ! ecev3
  105. character(len=128),parameter :: f_vggl_name = "FracLVeg"
  106. integer :: f_vggl_id = -77
  107. double precision :: f_vggl_data(MAXGRID,1)
  108. integer :: comp_id = -77
  109. integer :: part_id = -77
  110. integer :: t,t_step,yr,lyr,t_max,t_step_full,cell,loopyr
  111. integer :: ierror
  112. integer::ix,iy
  113. ! VARIABLE FIELDS
  114. character(len=100) :: nc_temp_file
  115. character(len=100) :: nc_precs_file
  116. character(len=100) :: nc_precc_file
  117. character(len=100) :: nc_snowfall_file
  118. character(len=100) :: nc_st1l_file
  119. character(len=100) :: nc_st2l_file
  120. character(len=100) :: nc_st3l_file
  121. character(len=100) :: nc_st4l_file
  122. character(len=100) :: nc_sm1l_file
  123. character(len=100) :: nc_sm2l_file
  124. character(len=100) :: nc_sm3l_file
  125. character(len=100) :: nc_sm4l_file
  126. character(len=100) :: nc_rads_file
  127. character(len=100) :: nc_radl_file
  128. ! FIXED FIELDS - T159!!!!
  129. ! character(len=*),parameter::nc_vegltype_file="/nobackup/rossby15/sm_paumi/preind/tvl.nc"
  130. ! character(len=*),parameter::nc_veghtype_file="/nobackup/rossby15/sm_paumi/preind/tvh.nc"
  131. logical :: isleapyear = .false.
  132. character yearstr*4
  133. ! VARIABLE NAMES
  134. character(len=*),parameter::nc_temp_name="var167"
  135. character(len=*),parameter::nc_precs_name="var142"
  136. character(len=*),parameter::nc_precc_name="var143"
  137. character(len=*),parameter::nc_snowfall_name="var144"
  138. ! We do not have the SNOC and SNOD data, so we send fixed values to guess below.
  139. character(len=*),parameter::nc_st1l_name="var139"
  140. character(len=*),parameter::nc_st2l_name="var170"
  141. ! ST3L and ST4L - we do not have this data, so we'll send ST2L values instead - see below.
  142. ! TODO use data from IFS which is now available
  143. character(len=*),parameter::nc_st3l_name="var183"
  144. character(len=*),parameter::nc_st4l_name="var236"
  145. character(len=*),parameter::nc_sm1l_name="var039" ! AMIP files have this
  146. character(len=*),parameter::nc_sm2l_name="var040"
  147. character(len=*),parameter::nc_sm3l_name="var041"
  148. character(len=*),parameter::nc_sm4l_name="var042"
  149. character(len=*),parameter::nc_sm1l_varname="var39"
  150. character(len=*),parameter::nc_sm2l_varname="var40"
  151. character(len=*),parameter::nc_sm3l_varname="var41"
  152. character(len=*),parameter::nc_sm4l_varname="var42"
  153. character(len=*),parameter::nc_rads_name="var176"
  154. character(len=*),parameter::nc_radl_name="var177"
  155. ! character(len=*),parameter::nc_vegl_name="tvl"
  156. ! character(len=*),parameter::nc_vegh_name="tvh"
  157. ! FIELD IDS
  158. integer::nc_temp_fileid,nc_precs_fileid,nc_rads_fileid,nc_radl_fileid,nc_vegl_fileid,nc_vegh_fileid,nc_precc_fileid,nc_snowfall_fileid;
  159. integer::nc_temp_varid,nc_precs_varid,nc_rads_varid,nc_radl_varid,nc_vegl_varid,nc_vegh_varid,nc_precc_varid,nc_snowfall_varid;
  160. ! integer::nc_vegltype_varid; ! We don't have a T255 file for vegltype yet
  161. integer::nc_st1l_fileid,nc_st2l_fileid,nc_st3l_fileid,nc_st4l_fileid;
  162. integer::nc_st1l_varid,nc_st2l_varid,nc_st3l_varid,nc_st4l_varid;
  163. integer::nc_sm1l_fileid,nc_sm2l_fileid,nc_sm3l_fileid,nc_sm4l_fileid;
  164. integer::nc_sm1l_varid,nc_sm2l_varid,nc_sm3l_varid,nc_sm4l_varid;
  165. integer::localcomm, cplcomm, icpl;
  166. ! *** START ***
  167. write (*,'(A)') "*II* lpjg_forcing: Hello"
  168. ! Read RunLengthSec,TimeStepSec from namelist
  169. inquire(NAMLPJGFORCU,opened=LPJGFORCnotFree)
  170. if (LPJGFORCnotFree) call ERROR('Namelist LPJGFORC not free')
  171. open(NAMLPJGFORCU,file=NamelistFileName,status='OLD')
  172. read(NAMLPJGFORCU,nml=NAMLPJGFORC)
  173. close(NAMLPJGFORCU)
  174. write (*,'(A)') "*II* lpjg_forcing: Now initialising Lpjg_forcing using oasis_..."
  175. call oasis_init_comp(comp_id,model_name,ierror)
  176. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_init_comp returned ierror=",ierror
  177. ! call oasis_get_localcomm(localcomm, ierror)
  178. ! write (*,'(A,I3)') "*II* lpjg_forcing: get_localcomm ierror=",ierror
  179. ! write (*,'(A,I12)') "*II* lpjg_forcing: oasis_get_localcomm returned localcomm =",localcomm
  180. icpl = 1
  181. call oasis_create_couplcomm(icpl,MPI_COMM_SELF, cplcomm, ierror)
  182. ! call oasis_create_couplcomm(icpl,localcomm, cplcomm, ierror)
  183. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_create_couplcomm ierror=",ierror
  184. write (*,'(A,I12)') "*II* lpjg_forcing: oasis_create_couplcomm returned cplcomm =",cplcomm
  185. call oasis_def_partition(part_id,(/ 0,0,MAXGRID*1 /),ierror)
  186. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_partition returned part_id =",part_id
  187. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_partition returned ierror =",ierror
  188. call oasis_def_var( f_temp_id, f_temp_name, &
  189. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  190. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_temp_id =",f_temp_id
  191. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  192. call oasis_def_var( f_prec_id, f_prec_name, &
  193. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  194. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_prec_id =",f_prec_id
  195. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  196. ! call oasis_def_var( f_vegl_id, f_vegl_name, &
  197. ! part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  198. ! write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_vegl_id =",f_vegl_id
  199. ! write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  200. ! call oasis_def_var( f_vegh_id, f_vegh_name, &
  201. ! part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  202. ! write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_vegh_id =",f_vegh_id
  203. ! write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  204. ! call oasis_def_var( f_vegltype_id, f_vegltype_name, &
  205. ! part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  206. ! write (*,'(A,I3)') "*II* lpjg_forcing: f_vegltype_id =",f_vegltype_id
  207. ! write (*,'(A,I3)') "*II* lpjg_forcing: returned ierror=",ierror
  208. call oasis_def_var( f_snoc_id, f_snoc_name, &
  209. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  210. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_snoc_id =",f_snoc_id
  211. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  212. call oasis_def_var( f_snod_id, f_snod_name, &
  213. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  214. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_snod_id =",f_snod_id
  215. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  216. call oasis_def_var( f_st1l_id, f_st1l_name, &
  217. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  218. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_st1l_id =",f_st1l_id
  219. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  220. call oasis_def_var( f_st2l_id, f_st2l_name, &
  221. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  222. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_st2l_id =",f_st2l_id
  223. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  224. call oasis_def_var( f_st3l_id, f_st3l_name, &
  225. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  226. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_st3l_id =",f_st3l_id
  227. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  228. call oasis_def_var( f_st4l_id, f_st4l_name, &
  229. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  230. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_st4l_id =",f_st4l_id
  231. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  232. call oasis_def_var( f_sm1l_id, f_sm1l_name, &
  233. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  234. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_sm1l_id =",f_sm1l_id
  235. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  236. call oasis_def_var( f_sm2l_id, f_sm2l_name, &
  237. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  238. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_sm2l_id =",f_sm2l_id
  239. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  240. call oasis_def_var( f_sm3l_id, f_sm3l_name, &
  241. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  242. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_sm3l_id =",f_sm3l_id
  243. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  244. call oasis_def_var( f_sm4l_id, f_sm4l_name, &
  245. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  246. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_sm4l_id =",f_sm4l_id
  247. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  248. call oasis_def_var( f_rads_id, f_rads_name, &
  249. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  250. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_rads_id =",f_rads_id
  251. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  252. call oasis_def_var( f_radl_id, f_radl_name, &
  253. part_id, (/ 2,1 /), PRISM_Out, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  254. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_radl_id =",f_radl_id
  255. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  256. ! LLAI
  257. call oasis_def_var( f_llai_id, f_llai_name, &
  258. part_id, (/ 2,1 /), PRISM_In, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  259. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_llai_id =",f_llai_id
  260. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  261. ! HLAI
  262. call oasis_def_var( f_hlai_id, f_hlai_name, &
  263. part_id, (/ 2,1 /), PRISM_In, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  264. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_hlai_id =",f_hlai_id
  265. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  266. ! TYPH
  267. call oasis_def_var( f_typh_id, f_typh_name, &
  268. part_id, (/ 2,1 /), PRISM_In, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  269. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_typh_id =",f_typh_id
  270. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  271. ! VEGH
  272. call oasis_def_var( f_vggh_id, f_vggh_name, &
  273. part_id, (/ 2,1 /), PRISM_In, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  274. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_vggh_id =",f_vggh_id
  275. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  276. ! ecev3 TYPL
  277. call oasis_def_var( f_typl_id, f_typl_name, &
  278. part_id, (/ 2,1 /), PRISM_In, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  279. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_typl_id =",f_typl_id
  280. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  281. ! ecev3 VEGL
  282. call oasis_def_var( f_vggl_id, f_vggl_name, &
  283. part_id, (/ 2,1 /), PRISM_In, (/ 1,MAXGRID,1,1 /), PRISM_Real, ierror )
  284. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned f_vggl_id =",f_vggl_id
  285. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_def_var returned ierror =",ierror
  286. write (*,'(A)') "*II* lpjg_forcing: before call oasis_enddef(ierror)"
  287. call oasis_enddef(ierror)
  288. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_enddef returned ierror =",ierror
  289. ! FIXED FIELDS
  290. ! write (*,'(A)') "*II* lpjg_forcing: Reading vegl and vegh"
  291. ! VEGL
  292. ! call read_fixedfiels(MAXGRID,1,nc_vegl_file,nc_vegl_name,&
  293. ! f_vegl_data,nc_vegl_fileid,nc_vegl_varid)
  294. ! VEGH
  295. ! call read_fixedfiels(MAXGRID,1,nc_vegh_file,nc_vegh_name,&
  296. ! f_vegh_data,nc_vegh_fileid,nc_vegh_varid)
  297. write (*,'(A)') "*II* lpjg_forcing: Beginning time loop"
  298. t_step_full = 0
  299. ! Repetitions of forcing
  300. do lyr = 1, num_loops
  301. ! TODO fix various write call format, e.g. this one does not print lyr
  302. write (*,'(A)') "*III* lpjg_forcing: Beginning loop #",lyr
  303. ! Year loop
  304. do loopyr = start_year, start_year+num_years-1
  305. write (*,'(A)') "*III* lpjg_forcing: Beginning year",loopyr
  306. yr = loopyr
  307. if (loopyr < 1870) yr = loopyr + 20
  308. ! if (loopyr < 1870 .and. loopyr > 1859) yr = loopyr + 10
  309. ! Leap year?
  310. isleapyear = .false.
  311. if (mod(yr,4) .eq. 0) isleapyear = .true.
  312. if (mod(yr,100) .eq. 0) isleapyear = .false.
  313. if (mod(yr,400) .eq. 0) isleapyear = .true.
  314. ! Create file names
  315. write(unit=yearstr, fmt='(I4)') yr
  316. write (*,'(A)') "netcdf files to read:"
  317. nc_temp_file = trim(nc_file_path)//"/"//nc_temp_name//"_"//yearstr//nc_file_tail
  318. write (*,'(A)') nc_temp_file
  319. nc_precs_file = trim(nc_file_path)//"/"//nc_precs_name//"_"//yearstr//trim(nc_file_tail)
  320. write (*,'(A)') nc_precs_file
  321. nc_precc_file = trim(nc_file_path)//"/"//nc_precc_name//"_"//yearstr//trim(nc_file_tail)
  322. write (*,'(A)') nc_precc_file
  323. nc_snowfall_file=trim(nc_file_path)//"/"//nc_snowfall_name//"_"//yearstr//trim(nc_file_tail)
  324. write (*,'(A)') nc_snowfall_file
  325. nc_st1l_file=trim(nc_file_path)//"/"//nc_st1l_name//"_"//yearstr//trim(nc_file_tail)
  326. write (*,'(A)') nc_st1l_file
  327. nc_st2l_file=trim(nc_file_path)//"/"//nc_st2l_name//"_"//yearstr//trim(nc_file_tail)
  328. write (*,'(A)') nc_st2l_file
  329. !nc_st3l_file=trim(nc_file_path)//"/"//nc_st3l_name//"_"//yearstr//trim(nc_file_tail)
  330. !write (*,'(A)') nc_st3l_file
  331. !nc_st4l_file=trim(nc_file_path)//"/"//nc_st4l_name//"_"//yearstr//trim(nc_file_tail)
  332. !write (*,'(A)') nc_st4l_file
  333. nc_sm1l_file=trim(nc_file_path)//"/"//nc_sm1l_name//"_"//yearstr//trim(nc_file_tail)
  334. write (*,'(A)') nc_sm1l_file
  335. nc_sm2l_file = trim(nc_file_path)//"/"//nc_sm2l_name//"_"//yearstr//trim(nc_file_tail)
  336. write (*,'(A)') nc_sm2l_file
  337. nc_sm3l_file = trim(nc_file_path)//"/"//nc_sm3l_name//"_"//yearstr//trim(nc_file_tail)
  338. write (*,'(A)') nc_sm3l_file
  339. nc_sm4l_file = trim(nc_file_path)//"/"//nc_sm4l_name //"_"//yearstr//trim(nc_file_tail)
  340. write (*,'(A)') nc_sm4l_file
  341. nc_rads_file = trim(nc_file_path)//"/"//nc_rads_name//"_"//yearstr//trim(nc_file_tail)
  342. write (*,'(A)') nc_rads_file
  343. nc_radl_file = trim(nc_file_path)//"/"//nc_radl_name//"_"//yearstr//trim(nc_file_tail)
  344. write (*,'(A)') nc_radl_file
  345. if (isleapyear .eq. .true.) then
  346. t_max = t_max_leap
  347. else
  348. t_max = t_max_year
  349. endif
  350. ! Day/6-hr loop for each year
  351. write (*,'(A,I5)') "*II* lpjg_forcing: t_max =",t_max
  352. do t_step=0,t_max-1
  353. write (*,'(A)') "*III* lpjg_forcing: Beginning dayloop ",t_step
  354. t = t_step_full*86400
  355. ! reading climate data from NetCDF file
  356. ! PM - changed to 6,12 from 2,6
  357. write (*,'(A,I6,A,I12)') "*II* lpjg_forcing before read_ifstest: Time step t = ",t_step," - time t=",t
  358. ! PM to _pi version
  359. call read_ifstest_pi(MAXGRID,1,t_step,t_max,nc_temp_file,nc_temp_name,&
  360. f_temp_data,nc_temp_fileid,nc_temp_varid)
  361. call read_ifstest_pi(MAXGRID,1,t_step,t_max,nc_precs_file,nc_precs_name,&
  362. f_precs_data,nc_precs_fileid,nc_precs_varid)
  363. call read_ifstest_pi(MAXGRID,1,t_step,t_max,nc_precc_file,nc_precc_name,&
  364. f_precc_data,nc_precc_fileid,nc_precc_varid)
  365. ! PM - changed to 6,12 from 2,6
  366. write (*,'(A,I6,A,I12)') "*II* lpjg_forcing after precip: Time step t = ",t_step," - time t=",t
  367. call read_ifstest_pi_depth(MAXGRID,1,t_step,t_max,nc_st1l_file,nc_st1l_name,&
  368. f_st1l_data,nc_st1l_fileid,nc_st1l_varid)
  369. call read_ifstest_pi_depth(MAXGRID,1,t_step,t_max,nc_st2l_file,nc_st2l_name,&
  370. f_st2l_data,nc_st2l_fileid,nc_st2l_varid)
  371. ! PM - changed to 6,12 from 2,6
  372. !write (*,'(A,I6,A,I12)') "*II* lpjg_forcing after st1l and st2l: Time step t = ",t_step," - time t=",t
  373. !call read_ifstest_pi_depth(MAXGRID,1,t_step,t_max,nc_st3l_file,nc_st3l_name,&
  374. ! f_st3l_data,nc_st3l_fileid,nc_st3l_varid)
  375. !call read_ifstest_pi_depth(MAXGRID,1,t_step,t_max,nc_st4l_file,nc_st4l_name,&
  376. ! f_st4l_data,nc_st4l_fileid,nc_st4l_varid)
  377. call read_ifstest_pi_depth(MAXGRID,1,t_step,t_max,nc_sm1l_file,nc_sm1l_varname,&
  378. f_sm1l_data,nc_sm1l_fileid,nc_sm1l_varid)
  379. call read_ifstest_pi_depth(MAXGRID,1,t_step,t_max,nc_sm2l_file,nc_sm2l_varname,&
  380. f_sm2l_data,nc_sm2l_fileid,nc_sm2l_varid)
  381. call read_ifstest_pi_depth(MAXGRID,1,t_step,t_max,nc_sm3l_file,nc_sm3l_varname,&
  382. f_sm3l_data,nc_sm3l_fileid,nc_sm3l_varid)
  383. call read_ifstest_pi_depth(MAXGRID,1,t_step,t_max,nc_sm4l_file,nc_sm4l_varname,&
  384. f_sm4l_data,nc_sm4l_fileid,nc_sm4l_varid)
  385. ! PM - changed to 6,12 from 2,6
  386. write (*,'(A,I6,A,I12)') "*II* lpjg_forcing after SM files: Time step t = ",t_step," - time t=",t
  387. call read_ifstest_pi(MAXGRID,1,t_step,t_max,nc_snowfall_file,nc_snowfall_name,&
  388. f_snowfall_data,nc_snowfall_fileid,nc_snowfall_varid)
  389. call read_ifstest_pi(MAXGRID,1,t_step,t_max,nc_rads_file,nc_rads_name,&
  390. f_rads_data,nc_rads_fileid,nc_rads_varid)
  391. call read_ifstest_pi(MAXGRID,1,t_step,t_max,nc_radl_file,nc_radl_name,&
  392. f_radl_data,nc_radl_fileid,nc_radl_varid)
  393. ! Sum precipitation and snow components
  394. ! Replace ST3L and ST4L with values from ST2L
  395. do cell = 1, MAXGRID
  396. ! Total precip includes snow here
  397. f_prec_data(cell,1) = 4 * 1000.0 *(f_precs_data(cell,1) + f_precc_data(cell,1) + f_snowfall_data(cell,1))
  398. ! AMIP data have units m/6h average, so *4 *
  399. ! 1000 to get mm/day
  400. ! Now * 1000 and / 1000 to go to kg m-2 day-1,
  401. ! and / 86400.0 to get to kg m-2 s-1
  402. ! PM_Apr2012 - convert m to kg m-2 s-1 to mimic ECE - we'll convert back in LPJG
  403. f_prec_data(cell,1)=f_prec_data(cell,1)/86400.0
  404. f_st3l_data(cell,1) = f_st2l_data(cell,1)
  405. f_st4l_data(cell,1) = f_st2l_data(cell,1)
  406. ! Snow
  407. f_snoc_data(cell,1) = 0.0
  408. f_snod_data(cell,1) = 330.0
  409. ! PM_Apr2012 - change J m-2 to W m-2 to be consistent with ECE. We'll remove the / in LPJG.
  410. f_rads_data(cell,1) = 4* f_rads_data(cell,1) / 86400.0
  411. f_radl_data(cell,1) = 4* f_radl_data(cell,1) / 86400.0
  412. enddo
  413. ! do cell = 1, MAXGRID
  414. ! ! Enforce vegltype as grassland
  415. ! f_vegltype_data(cell,1) = 2;
  416. ! enddo
  417. ! PM - changed to 6,12 from 2,6
  418. write (*,'(A,I6,A,I12)') "*II* lpjg_forcing after ifstest: Time step t = ",t_step," - time t=",t
  419. ! -----------------------------------------------------------------------------------
  420. ! *** PUT variables
  421. ! -----------------------------------------------------------------------------------
  422. write (*,'(A,I6,A,I12)') "*II* lpjg_forcingPUT : Time step t = ",t_step," - time t=",t
  423. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_temp_id =",f_temp_id
  424. call oasis_put(f_temp_id,t,f_temp_data,ierror)
  425. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  426. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_rads_id =",f_rads_id
  427. call oasis_put(f_rads_id,t,f_rads_data,ierror)
  428. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  429. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_radl_id =",f_radl_id
  430. call oasis_put(f_radl_id,t,f_radl_data,ierror)
  431. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  432. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_sm1l_id =",f_sm1l_id
  433. call oasis_put(f_sm1l_id,t,f_sm1l_data,ierror)
  434. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  435. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_sm2l_id =",f_sm2l_id
  436. call oasis_put(f_sm2l_id,t,f_sm2l_data,ierror)
  437. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  438. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_sm3l_id =",f_sm3l_id
  439. call oasis_put(f_sm3l_id,t,f_sm3l_data,ierror)
  440. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  441. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_sm4l_id =",f_sm4l_id
  442. call oasis_put(f_sm4l_id,t,f_sm4l_data,ierror)
  443. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  444. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_st1l_id =",f_st1l_id
  445. call oasis_put(f_st1l_id,t,f_st1l_data,ierror)
  446. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  447. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_st2l_id =",f_st2l_id
  448. call oasis_put(f_st2l_id,t,f_st2l_data,ierror)
  449. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  450. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_st3l_id =",f_st3l_id
  451. call oasis_put(f_st3l_id,t,f_st3l_data,ierror)
  452. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  453. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_st4l_id =",f_st4l_id
  454. call oasis_put(f_st4l_id,t,f_st4l_data,ierror)
  455. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  456. ! Snow mass/unit surface (kg/m2)
  457. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_snoc_id =",f_snoc_id
  458. call oasis_put(f_snoc_id,t,f_snoc_data,ierror)
  459. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  460. ! Snow density (kg/m3)
  461. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_snod_id =",f_snod_id
  462. call oasis_put(f_snod_id,t,f_snod_data,ierror)
  463. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  464. ! Veg low
  465. ! write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_vegl_id =",f_vegl_id
  466. ! call oasis_put(f_vegl_id,t,f_vegl_data,ierror)
  467. ! write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  468. ! Veg type low
  469. ! write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_vegltype_id =",f_vegltype_id
  470. ! call oasis_put(f_vegltype_id,t,f_vegltype_data,ierror)
  471. ! write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  472. ! Veg high
  473. ! write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_vegh_id =",f_vegh_id
  474. ! call oasis_put(f_vegh_id,t,f_vegh_data,ierror)
  475. ! write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  476. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_put with f_prec_id =",f_prec_id
  477. call oasis_put(f_prec_id,t,f_prec_data,ierror)
  478. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_put returned ierror =",ierror
  479. ! -----------------------------------------------------------------------------------
  480. ! *** GET variables
  481. ! -----------------------------------------------------------------------------------
  482. write (*,'(A,I6,A,I12)') "*II* lpjg_forcingGET : Time step t = ",t_step," - time t=",t
  483. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_get with f_llai_id =",f_llai_id
  484. call oasis_get(f_llai_id,t,f_llai_data,ierror)
  485. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_get returned ierror =",ierror
  486. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_get with f_hlai_id =",f_hlai_id
  487. call oasis_get(f_hlai_id,t,f_hlai_data,ierror)
  488. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_get returned ierror =",ierror
  489. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_get with f_typh_id =",f_typh_id
  490. call oasis_get(f_typh_id,t,f_typh_data,ierror)
  491. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_get returned ierror =",ierror
  492. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_get with f_vggh_id =",f_vggh_id
  493. call oasis_get(f_vggh_id,t,f_vggh_data,ierror)
  494. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_get returned ierror =",ierror
  495. ! ecev3
  496. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_get with f_typl_id =",f_typl_id
  497. call oasis_get(f_typl_id,t,f_typl_data,ierror)
  498. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_get returned ierror =",ierror
  499. ! ecev3
  500. write (*,'(A,I3)') "*II* lpjg_forcing: calling oasis_get with f_vggl_id =",f_vggl_id
  501. call oasis_get(f_vggl_id,t,f_vggl_data,ierror)
  502. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_get returned ierror =",ierror
  503. ! checking whether the incoming LAI data are ok:
  504. write(*,*)"*II* lpjg_forcing: LLAI obtained from OASIS for test gridcell (g=8000) is ",f_llai_data(8000,1)
  505. write(*,*)"*II* lpjg_forcing: HLAI obtained from OASIS for test gridcell (g=8000) is ",f_hlai_data(8000,1)
  506. write(*,*)"*II* lpjg_forcing: TYPH obtained from OASIS for test gridcell (g=8000) is ",f_typh_data(8000,1)
  507. write(*,*)"*II* lpjg_forcing: VEGH obtained from OASIS for test gridcell (g=8000) is ",f_vggh_data(8000,1)
  508. write(*,*)"*II* lpjg_forcing: TYPL obtained from OASIS for test gridcell (g=8000) is ",f_typl_data(8000,1)
  509. write(*,*)"*II* lpjg_forcing: VEGL obtained from OASIS for test gridcell (g=8000) is ",f_vggl_data(8000,1)
  510. write (*,'(A,I6,A,I12)') "*II* lpjg_forcing DIAGS LAI check: Time step t = ",t_step," - time t=",t
  511. ! Check for min/max LAI
  512. minhlai=0
  513. maxhlai=0
  514. minllai=0
  515. maxllai=0
  516. meanhlai=0
  517. meanllai=0
  518. meanvegl=0
  519. meanvegh=0
  520. maxcvh=-1
  521. maxcvl=-1
  522. maxtvh=-1
  523. maxtvl=-1
  524. cover=0.0
  525. do cell = 1, MAXGRID
  526. if (f_llai_data(cell,1)>maxllai)then
  527. maxllai=f_llai_data(cell,1)
  528. endif
  529. meanllai = meanllai + f_llai_data(cell,1)/MAXGRID
  530. if (f_llai_data(cell,1)<minllai)then
  531. minllai=f_llai_data(cell,1)
  532. endif
  533. if (f_hlai_data(cell,1)>maxhlai)then
  534. maxhlai=f_hlai_data(cell,1)
  535. endif
  536. if (f_hlai_data(cell,1)<minhlai)then
  537. minhlai=f_hlai_data(cell,1)
  538. endif
  539. meanhlai = meanhlai + f_hlai_data(cell,1)/MAXGRID
  540. if (f_vggl_data(cell,1)>maxcvl)then
  541. maxcvl=f_vggl_data(cell,1)
  542. endif
  543. if (f_vggh_data(cell,1)>maxcvh)then
  544. maxcvh=f_vggh_data(cell,1)
  545. endif
  546. ! meanvegl = meanvegl + f_vegl_data(cell,1)/MAXGRID
  547. ! meanvegh = meanvegh + f_vegh_data(cell,1)/MAXGRID
  548. if (f_typl_data(cell,1)>maxtvl)then
  549. maxtvl=f_typl_data(cell,1)
  550. endif
  551. if (f_typh_data(cell,1)>maxtvh)then
  552. maxtvh=f_typh_data(cell,1)
  553. endif
  554. cover=f_vggl_data(cell,1)+f_vggh_data(cell,1)
  555. if (cover>1.001) then
  556. write(*,*)"*II* lpjg_forcing: COVER ERROR!",cover
  557. endif
  558. enddo
  559. write(*,*)"*II* lpjg_forcing DIAGS: MAX HLAI :",maxhlai
  560. write(*,*)"*II* lpjg_forcing: MIN HLAI :",minhlai
  561. write(*,*)"*II* lpjg_forcing: MAX LLAI :",maxllai
  562. write(*,*)"*II* lpjg_forcing: MIN LLAI :",minllai
  563. write(*,*)"*II* lpjg_forcing: MEAN LLAI :",meanllai
  564. write(*,*)"*II* lpjg_forcing: MEAN HLAI :",meanhlai
  565. ! write(*,*)"*II* lpjg_forcing: MEAN VEGL :",meanvegl
  566. ! write(*,*)"*II* lpjg_forcing: MEAN VEGH :",meanvegh
  567. ! write(*,*)"*II* lpjg_forcing: MAX VEGL :",maxcvl
  568. ! write(*,*)"*II* lpjg_forcing: MAX VEGH :",maxcvh
  569. write(*,*)"*II* lpjg_forcing: MAX TYPL :",maxtvl
  570. write(*,*)"*II* lpjg_forcing: MAX TYPH :",maxtvh
  571. write (*,*) "*III* lpjg_forcing: Finished dayloop!",t_step, t_max
  572. ! Increase the full simulation counter
  573. t_step_full = t_step_full + 1
  574. ! End of dayloop
  575. enddo
  576. write (*,*) "*II* lpjg_forcing: End of year!",loopyr
  577. ! End of year loop
  578. enddo
  579. write (*,'(A)') "*II* lpjg_forcing: Finished time loop!"
  580. ! End of repetition loop
  581. enddo
  582. write (*,'(A)') "*II* lpjg_forcing: oasis_terminate..."
  583. call oasis_terminate(ierror)
  584. write (*,'(A,I3)') "*II* lpjg_forcing: oasis_terminate returned ierror =",ierror
  585. end program LPJGFORC
  586. ! PM - for pre-Industrial nc files.
  587. ! now reads new_ files
  588. ! ---------------------------------------------------------------------------------------------------------------
  589. subroutine read_ifstest_pi(NX,NY,t_step,t_max,filename,parname, &
  590. data_in,fileid,varid)
  591. ! NetCDF
  592. use netcdf
  593. implicit none
  594. integer::NX,NY,t_step,t_max
  595. character(len=*)::filename
  596. character(len=*)::parname
  597. double precision::data_in(NX,NY)
  598. integer::fileid
  599. integer::varid
  600. ! for older dpic_ files:
  601. !integer::start(2),count(2)
  602. !start=(/1,t_step+1/)
  603. !count=(/NX,NY/)
  604. ! for new_ files:
  605. integer::start(3),count(3)
  606. start=(/1,1,t_step+1/)
  607. count=(/NX,NY,1/)
  608. ! read file properties in first occasion
  609. if(t_step==0)then
  610. call check(nf90_open(filename,NF90_NOWRITE,fileid))
  611. call check(nf90_inq_varid(fileid,parname,varid))
  612. endif
  613. ! read field for given timestep
  614. call check(nf90_get_var(fileid,varid,data_in,start=start,count=count))
  615. ! close NetCDF file
  616. if(t_step==t_max-1)then
  617. call check(nf90_close(fileid))
  618. endif
  619. end
  620. ! PM - for pre-Industrial nc files with DEPTH
  621. ! ---------------------------------------------------------------------------------------------------------------
  622. subroutine read_ifstest_pi_depth(NX,NY,t_step,t_max,filename,parname, &
  623. data_in,fileid,varid)
  624. ! NetCDF
  625. use netcdf
  626. implicit none
  627. integer::NX,NY,t_step,t_max
  628. character(len=*)::filename
  629. character(len=*)::parname
  630. double precision::data_in(NX,NY)
  631. integer::fileid
  632. integer::varid
  633. ! double precision::data_in(NX,NY)
  634. ! integer::fileid
  635. ! integer::varid
  636. !integer::start(3),count(3)
  637. !start=(/1,1,t_step+1/)
  638. !count=(/NX,NY,1/)
  639. ! new_ files
  640. integer::start(4),count(4)
  641. start=(/1,1,1,t_step+1/)
  642. count=(/NX,NY,1,1/)
  643. ! read file properties in first occasion
  644. if(t_step==0)then
  645. call check(nf90_open(filename,NF90_NOWRITE,fileid))
  646. call check(nf90_inq_varid(fileid,parname,varid))
  647. endif
  648. ! read field for given timestep
  649. call check(nf90_get_var(fileid,varid,data_in,start=start,count=count))
  650. ! close NetCDF file
  651. if(t_step==t_max-1)then
  652. call check(nf90_close(fileid))
  653. endif
  654. end
  655. subroutine ERROR(msg)
  656. character(len=*),intent(in) :: msg
  657. write (*,'("*EE*",A)') msg
  658. stop 'Aborting lpjg_forcing.'
  659. end subroutine ERROR
  660. ! PM - for fixed nc files.
  661. ! ---------------------------------------------------------------------------------------------------------------
  662. subroutine read_fixedfiels(NX,NY,filename,parname,data_in,fileid,varid)
  663. ! NetCDF
  664. use netcdf
  665. implicit none
  666. integer::NX,NY
  667. character(len=*)::filename
  668. character(len=*)::parname
  669. double precision::data_in(NX,NY)
  670. integer::fileid
  671. integer::varid
  672. integer::start(2),count(2)
  673. start=(/1,1/)
  674. count=(/NX,NY/)
  675. ! read file properties in first occasion
  676. call check(nf90_open(filename,NF90_NOWRITE,fileid))
  677. call check(nf90_inq_varid(fileid,parname,varid))
  678. ! read field
  679. call check(nf90_get_var(fileid,varid,data_in,start=start,count=count))
  680. ! close NetCDF file
  681. call check(nf90_close(fileid))
  682. end
  683. ! ---------------------------------------------------------------------------------------------------------------
  684. subroutine read_ifstest(NX,NY,t_step,t_max,filename,parname, &
  685. data_in,fileid,varid)
  686. ! NetCDF
  687. use netcdf
  688. implicit none
  689. integer::NX,NY,t_step,t_max
  690. character(len=*)::filename
  691. character(len=*)::parname
  692. double precision::data_in(NX,NY)
  693. integer::fileid
  694. integer::varid
  695. integer::start(3),count(3)
  696. start=(/1,1,t_step+1/)
  697. count=(/NX,NY,1/)
  698. ! read file properties in first occasion
  699. if(t_step==0)then
  700. call check(nf90_open(filename,NF90_NOWRITE,fileid))
  701. call check(nf90_inq_varid(fileid,parname,varid))
  702. endif
  703. ! read field for given timestep
  704. call check(nf90_get_var(fileid,varid,data_in,start=start,count=count))
  705. ! close NetCDF file
  706. if(t_step==t_max-1)then
  707. call check(nf90_close(fileid))
  708. endif
  709. end
  710. ! ---------------------------------------------------------------------------------------------------------------
  711. subroutine check(status)
  712. use netcdf
  713. integer, intent ( in) :: status
  714. if(status /= nf90_noerr) then
  715. print *, trim(nf90_strerror(status))
  716. ! stop "Stopped"
  717. stop 1
  718. end if
  719. end subroutine check
  720. ! ---------------------------------------------------------------------------------------------------------------