OasisCoupler.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. #include <iostream>
  2. #include "config.h"
  3. #include "shell.h"
  4. #include "oasis-cpp-interface.h"
  5. #include "OasisCoupler.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. using namespace std;
  9. char OasisCoupler::modelName[] = "lpjg";
  10. // *** Received FROM IFS ***
  11. // 1
  12. char OasisCoupler::fieldTempName[] = "T2M_LPJG";
  13. int OasisCoupler::fieldTempId = 0;
  14. // 2
  15. char OasisCoupler::fieldPrecipName[] = "TPRE_LPJ";
  16. int OasisCoupler::fieldPrecipId = 0;
  17. // 3
  18. char OasisCoupler::fieldSnowCName[] = "SNOC_LPJ";
  19. int OasisCoupler::fieldSnowCId = 0;
  20. // 4
  21. char OasisCoupler::fieldSnowDName[] = "SNOD_LPJ";
  22. int OasisCoupler::fieldSnowDId = 0;
  23. // 5
  24. char OasisCoupler::fieldST1LName[] = "ST1L_LPJ";
  25. int OasisCoupler::fieldST1LId = 0;
  26. // 6
  27. char OasisCoupler::fieldST2LName[] = "ST2L_LPJ";
  28. int OasisCoupler::fieldST2LId = 0;
  29. // 7
  30. char OasisCoupler::fieldST3LName[] = "ST3L_LPJ";
  31. int OasisCoupler::fieldST3LId = 0;
  32. // 8
  33. char OasisCoupler::fieldST4LName[] = "ST4L_LPJ";
  34. int OasisCoupler::fieldST4LId = 0;
  35. // 9
  36. char OasisCoupler::fieldSM1LName[] = "SM1L_LPJ";
  37. int OasisCoupler::fieldSM1LId = 0;
  38. // 10
  39. char OasisCoupler::fieldSM2LName[] = "SM2L_LPJ";
  40. int OasisCoupler::fieldSM2LId = 0;
  41. // 11
  42. char OasisCoupler::fieldSM3LName[] = "SM3L_LPJ";
  43. int OasisCoupler::fieldSM3LId = 0;
  44. // 12
  45. char OasisCoupler::fieldSM4LName[] = "SM4L_LPJ";
  46. int OasisCoupler::fieldSM4LId = 0;
  47. // 13
  48. char OasisCoupler::fieldSWRadName[] = "SWNR_LPJ";
  49. int OasisCoupler::fieldSWRadId = 0;
  50. // 14
  51. char OasisCoupler::fieldLWRadName[] = "LWNR_LPJ";
  52. int OasisCoupler::fieldLWRadId = 0;
  53. // *** Send TO IFS ***
  54. // 16
  55. char OasisCoupler::fieldLowlaiName[] = "GUE_LLAI";
  56. int OasisCoupler::fieldLowlaiId = 0;
  57. // 17
  58. char OasisCoupler::fieldHighlaiName[] = "GUE_HLAI";
  59. int OasisCoupler::fieldHighlaiId = 0;
  60. // 18
  61. char OasisCoupler::fieldTypeHName[] = "GUE_TYPH";
  62. int OasisCoupler::fieldTypeHId = 0;
  63. // 19
  64. char OasisCoupler::fieldFracHName[] = "GUE_FRAH";
  65. int OasisCoupler::fieldFracHId = 0;
  66. // 20
  67. char OasisCoupler::fieldTypeLName[] = "GUE_TYPL";
  68. int OasisCoupler::fieldTypeLId = 0;
  69. // 21
  70. char OasisCoupler::fieldFracLName[] = "GUE_FRAL";
  71. int OasisCoupler::fieldFracLId = 0;
  72. // *** Received FROM TM5 ***
  73. // 22
  74. char OasisCoupler::fieldCO2Name[] = "CO2_LPJG";
  75. int OasisCoupler::fieldCO2Id = 0;
  76. // *** Sent TO TM5 ***
  77. // 23
  78. char OasisCoupler::fieldCfluxName[] = "GUE_CFLX";
  79. int OasisCoupler::fieldCfluxId = 0;
  80. // 24
  81. char OasisCoupler::fieldNPPName[] = "GUE_CNPP";
  82. int OasisCoupler::fieldNPPId = 0;
  83. // ecev3 - returns localcomm
  84. int OasisCoupler::init(int &localcomm)
  85. {
  86. int ierror;
  87. int componentId = -99;
  88. dprintf("OasisCoupler::init init_comp \n");
  89. ierror = OASISMCT::init_comp(&componentId,modelName);
  90. if (ierror != OASISMCT::OASIS_Ok) {
  91. dprintf("OasisCoupler::init init_comp ERROR!!\n");
  92. return ierror;
  93. }
  94. // ecev3 - for internal parallelisation
  95. int localCommId = -99;
  96. ierror = OASISMCT::get_localcomm(localCommId);
  97. if (ierror != OASISMCT::OASIS_Ok) {
  98. dprintf("OasisCoupler::get_localcomm ERROR - %i\n", ierror);
  99. OASISMCT::terminate();
  100. return ierror;
  101. }
  102. // Save the local comm index
  103. localcomm = localCommId;
  104. return OASISMCT::OASIS_Ok;
  105. };
  106. // ecev3 - returns couplcomm
  107. int OasisCoupler::create_couplcomm(int myrank, int lcomm, int& ccomm) {
  108. int ierror;
  109. dprintf("OasisCoupler::create_couplcomm \n");
  110. int cplcomm = -99;
  111. ierror = OASISMCT::create_couplcomm(myrank, lcomm, &cplcomm);
  112. if ( ierror != OASISMCT::OASIS_Ok )
  113. return ierror;
  114. else
  115. ccomm = cplcomm;
  116. return OASISMCT::OASIS_Ok;
  117. };
  118. // ecev3
  119. int OasisCoupler::init_part_defvar(int nx, int ny, bool TM5coupled, int rank) {
  120. int ierror;
  121. int partitionId = -99;
  122. int partitionDescr[] = {0,0,nx*ny};
  123. // ecev3 - see OASIS-MCT documentation
  124. if (rank != 0)
  125. partitionDescr[2] = 0;
  126. dprintf("OasisCoupler::init_part_defvar def_partition for rank %i\n", rank);
  127. ierror = OASISMCT::def_partition(&partitionId,partitionDescr,3);
  128. // Bug in OASISMCT: def_partition doesn't return a valid return value
  129. if ( ierror != OASISMCT::OASIS_Ok ) {
  130. dprintf("OasisCoupler::init_part_defvar: def_partition returned %i\n", ierror);
  131. return ierror;
  132. }
  133. dprintf("OasisCoupler::init_part_defvar: rank %i partitionId is %i\n", rank, partitionId);
  134. int varNumDims[] = {2,1};
  135. int varShape[] = {1,nx,1,ny};
  136. dprintf("OasisCoupler::init_part_defvar def_var statements for rank %i \n", rank);
  137. // *** Received FROM IFS (Currently 14) ***
  138. ierror = OASISMCT::def_var(&fieldTempId,fieldTempName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  139. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  140. ierror = OASISMCT::def_var(&fieldPrecipId,fieldPrecipName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  141. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  142. ierror = OASISMCT::def_var(&fieldSnowCId,fieldSnowCName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  143. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  144. ierror = OASISMCT::def_var(&fieldSnowDId,fieldSnowDName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  145. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  146. ierror = OASISMCT::def_var(&fieldST1LId,fieldST1LName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  147. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  148. ierror = OASISMCT::def_var(&fieldST2LId,fieldST2LName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  149. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  150. ierror = OASISMCT::def_var(&fieldST3LId,fieldST3LName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  151. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  152. ierror = OASISMCT::def_var(&fieldST4LId,fieldST4LName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  153. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  154. ierror = OASISMCT::def_var(&fieldSM1LId,fieldSM1LName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  155. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  156. ierror = OASISMCT::def_var(&fieldSM2LId,fieldSM2LName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  157. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  158. ierror = OASISMCT::def_var(&fieldSM3LId,fieldSM3LName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  159. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  160. ierror = OASISMCT::def_var(&fieldSM4LId,fieldSM4LName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  161. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  162. ierror = OASISMCT::def_var(&fieldSWRadId,fieldSWRadName,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  163. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  164. ierror = OASISMCT::def_var(&fieldLWRadId,fieldLWRadName,partitionId,varNumDims,OASISMCT::OASIS_In, varShape, OASISMCT::OASIS_Real);
  165. if (ierror != OASISMCT::OASIS_Ok) return ierror;
  166. // *** Sent TO IFS (Currently 6) ***
  167. ierror = OASISMCT::def_var(&fieldLowlaiId,fieldLowlaiName,partitionId,varNumDims,OASISMCT::OASIS_Out,varShape,OASISMCT::OASIS_Real);
  168. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  169. ierror = OASISMCT::def_var(&fieldHighlaiId,fieldHighlaiName,partitionId,varNumDims,OASISMCT::OASIS_Out,varShape,OASISMCT::OASIS_Real);
  170. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  171. ierror = OASISMCT::def_var(&fieldTypeHId,fieldTypeHName,partitionId,varNumDims,OASISMCT::OASIS_Out,varShape,OASISMCT::OASIS_Real);
  172. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  173. ierror = OASISMCT::def_var(&fieldFracHId,fieldFracHName,partitionId,varNumDims,OASISMCT::OASIS_Out,varShape,OASISMCT::OASIS_Real);
  174. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  175. ierror = OASISMCT::def_var(&fieldTypeLId,fieldTypeLName,partitionId,varNumDims,OASISMCT::OASIS_Out,varShape,OASISMCT::OASIS_Real);
  176. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  177. ierror = OASISMCT::def_var(&fieldFracLId,fieldFracLName,partitionId,varNumDims,OASISMCT::OASIS_Out,varShape,OASISMCT::OASIS_Real);
  178. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  179. // *** TM5 Coupling (Currently 3 fields) ***
  180. if (TM5coupled) {
  181. dprintf("OasisCoupler::init_part_defvar - initialising TM5 coupling\n");
  182. // FROM TM5
  183. ierror = OASISMCT::def_var(&fieldCO2Id,fieldCO2Name,partitionId,varNumDims,OASISMCT::OASIS_In,varShape,OASISMCT::OASIS_Real);
  184. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  185. // TO TM5
  186. ierror = OASISMCT::def_var(&fieldCfluxId,fieldCfluxName,partitionId,varNumDims,OASISMCT::OASIS_Out,varShape,OASISMCT::OASIS_Real);
  187. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  188. // TO TM5
  189. ierror = OASISMCT::def_var(&fieldNPPId,fieldNPPName,partitionId,varNumDims,OASISMCT::OASIS_Out,varShape,OASISMCT::OASIS_Real);
  190. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  191. }
  192. dprintf("OasisCoupler::init_part_defvar - calling OASISMCT::enddef on rank %i\n",rank);
  193. ierror = OASISMCT::enddef();
  194. dprintf("OasisCoupler::init_part_defvar - OASISMCT::enddef returned ierror %i on rank %i\n",ierror, rank);
  195. if (ierror != OASISMCT::OASIS_Ok) return ierror;
  196. return OASISMCT::OASIS_Ok;
  197. };
  198. int OasisCoupler::abort(int compid, std::string routine_name, std::string abort_message, int return_code)
  199. {
  200. //dprintf("OasisCoupler::abort %s\n",(char)abort_message);
  201. int ierror = OASISMCT::abort(compid, routine_name, abort_message, return_code);
  202. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  203. return 0;
  204. };
  205. int OasisCoupler::finalize(void)
  206. {
  207. dprintf("OasisCoupler::finalize\n");
  208. int ierror = OASISMCT::terminate();
  209. if ( ierror != OASISMCT::OASIS_Ok ) return ierror;
  210. return 0;
  211. };
  212. // Up to 18 fields (17 from IFS + 1 from TM5 if TM5coupled == true)
  213. int OasisCoupler::couple_get(int time, int nx, int ny, bool TM5coupled, double * fieldTempData, double * fieldPrecipData,
  214. double * fieldSnowCData, double * fieldSnowDData,
  215. double * fieldST1LData, double * fieldST2LData, double * fieldST3LData, double * fieldST4LData,
  216. double * fieldSM1LData, double * fieldSM2LData, double * fieldSM3LData, double * fieldSM4LData,
  217. double * fieldSWRadData, double * fieldLWRadData, double * fieldCO2Data) {
  218. int ierror = 0;
  219. try {
  220. // printf(" OasisCoupler::couple_get -- for time %i\n",time);
  221. ierror = OASISMCT::get_2d(OasisCoupler::fieldTempId,time,fieldTempData,nx,ny);
  222. // printf(" OasisCoupler::couple_get -- got T2m\n");
  223. }
  224. catch(...) {
  225. switch (ierror)
  226. {
  227. case OASISMCT::OASIS_Recvd:
  228. dprintf(" T2M received from other model: %i \n", ierror);
  229. break;
  230. case OASISMCT::OASIS_FromRest:
  231. dprintf(" Read from restart file only: %i \n", ierror);
  232. break;
  233. case OASISMCT::OASIS_Input:
  234. dprintf(" Read from input file only: %i \n", ierror);
  235. break;
  236. case OASISMCT::OASIS_RecvOut:
  237. dprintf(" Received from other model and written to an output file: %i \n", ierror);
  238. break;
  239. case OASISMCT::OASIS_FromRestOut:
  240. dprintf(" Read from restart file and written to output file: %i \n", ierror);
  241. break;
  242. case OASISMCT::OASIS_Ok:
  243. dprintf(" OASIS_Ok, no error. T2M received OK, continue: %i \n", ierror);
  244. break;
  245. default:
  246. dprintf(" OasisCoupler::couple_get - unknown ierror reported from OASIS_GET: %i \n", ierror);
  247. break;
  248. }
  249. }
  250. ierror = OASISMCT::get_2d(OasisCoupler::fieldSWRadId, time, fieldSWRadData, nx, ny);
  251. //printf(" OasisCoupler::couple -- got Rad\n");
  252. ierror = OASISMCT::get_2d(OasisCoupler::fieldLWRadId, time, fieldLWRadData, nx, ny);
  253. //printf(" OasisCoupler::couple -- got Rad\n");
  254. ierror = OASISMCT::get_2d(OasisCoupler::fieldSM1LId,time,fieldSM1LData,nx,ny);
  255. // printf(" OasisCoupler::couple -- got SM1\n");
  256. ierror = OASISMCT::get_2d(OasisCoupler::fieldSM2LId,time,fieldSM2LData,nx,ny);
  257. // printf(" OasisCoupler::couple -- got SM2\n");
  258. ierror = OASISMCT::get_2d(OasisCoupler::fieldSM3LId,time,fieldSM3LData,nx,ny);
  259. // printf(" OasisCoupler::couple -- got SM3\n");
  260. ierror = OASISMCT::get_2d(OasisCoupler::fieldSM4LId,time,fieldSM4LData,nx,ny);
  261. // printf(" OasisCoupler::couple -- got SM4\n");
  262. ierror = OASISMCT::get_2d(OasisCoupler::fieldST1LId,time,fieldST1LData,nx,ny);
  263. // printf(" OasisCoupler::couple -- got ST1\n");
  264. ierror = OASISMCT::get_2d(OasisCoupler::fieldST2LId,time,fieldST2LData,nx,ny);
  265. // printf(" OasisCoupler::couple -- got ST2\n");
  266. ierror = OASISMCT::get_2d(OasisCoupler::fieldST3LId,time,fieldST3LData,nx,ny);
  267. // printf(" OasisCoupler::couple -- got ST3\n");
  268. ierror = OASISMCT::get_2d(OasisCoupler::fieldST4LId,time,fieldST4LData,nx,ny);
  269. // printf(" OasisCoupler::couple -- got ST4\n");
  270. ierror = OASISMCT::get_2d(OasisCoupler::fieldSnowCId,time,fieldSnowCData,nx,ny);
  271. //printf(" OasisCoupler::couple -- got SnowC\n");
  272. ierror = OASISMCT::get_2d(OasisCoupler::fieldSnowDId,time,fieldSnowDData,nx,ny);
  273. // printf(" OasisCoupler::couple -- got SnowD\n");
  274. ierror = OASISMCT::get_2d(OasisCoupler::fieldPrecipId,time,fieldPrecipData,nx,ny);
  275. // printf(" OasisCoupler::couple -- got Prec\n");
  276. // ecev3 - only receive CO2 fields from TM5 if we're coupled
  277. if (TM5coupled) {
  278. ierror = OASISMCT::get_2d(OasisCoupler::fieldCO2Id,time,fieldCO2Data,nx,ny);
  279. dprintf(" OasisCoupler::couple -- got CO2 -- cell 5000 value is %f\n",fieldCO2Data[5000]);
  280. }
  281. return 0;
  282. };
  283. // Up to 8 fields (6 to IFS + 2 to TM5 if TM5coupled == true)
  284. int OasisCoupler::couple_put(int time, int nx, int ny, bool TM5coupled, double * fieldLowlaiData, double * fieldHighlaiData,
  285. double * fieldLPJGtypeHData, double * fieldLPJGfracHData,
  286. double * fieldLPJGtypeLData, double * fieldLPJGfracLData,
  287. double * fieldLPJGCfluxData, double * fieldLPJGNPPData) {
  288. int ierror = 0;
  289. try {
  290. // printf(" OasisCoupler::couple_put -- for time %i\n",time);
  291. ierror = OASISMCT::put_2d(OasisCoupler::fieldLowlaiId,time,fieldLowlaiData,nx,ny);
  292. }
  293. catch (...) {
  294. switch (ierror)
  295. {
  296. case OASISMCT::OASIS_Sent:
  297. dprintf(" LLAI field sent to the other model: %i \n",ierror);
  298. break;
  299. case OASISMCT::OASIS_LocTrans:
  300. dprintf(" OASIS_LocTrans: %i \n",ierror);
  301. break;
  302. case OASISMCT::OASIS_Output:
  303. dprintf(" Output file only: %i \n",ierror);
  304. break;
  305. case OASISMCT::OASIS_ToRest:
  306. dprintf(" Written to restart file only: %i \n",ierror);
  307. break;
  308. case OASISMCT::OASIS_ToRestOut:
  309. dprintf(" Written to restart file and written to output file: %i \n",ierror);
  310. break;
  311. case OASISMCT::OASIS_SentOut:
  312. dprintf(" OASIS_SentOut: %i \n",ierror);
  313. break;
  314. case OASISMCT::OASIS_Ok:
  315. dprintf(" OASIS_Ok, LLAI sent, no error: %i - continue\n",ierror);
  316. break;
  317. default:
  318. dprintf(" OasisCoupler::couple_put - unknown ierror %i reported from OASIS_PUT for field %i \n",ierror,OasisCoupler::fieldLowlaiId);
  319. break;
  320. }
  321. }
  322. // ecev3 - always send fields to IFS
  323. ierror = OASISMCT::put_2d(OasisCoupler::fieldHighlaiId,time,fieldHighlaiData,nx,ny);
  324. if (ierror != OASISMCT::OASIS_Ok)
  325. dprintf(" OasisCoupler::couple_put HLAI - ierror: %i\n",ierror);
  326. ierror = OASISMCT::put_2d(OasisCoupler::fieldTypeHId,time,fieldLPJGtypeHData,nx,ny);
  327. if (ierror != OASISMCT::OASIS_Ok)
  328. dprintf(" OasisCoupler::couple_put TYPH - ierror: %i\n",ierror);
  329. ierror = OASISMCT::put_2d(OasisCoupler::fieldFracHId,time,fieldLPJGfracHData,nx,ny);
  330. if (ierror != OASISMCT::OASIS_Ok)
  331. dprintf(" OasisCoupler::couple_put FRACH - ierror: %i\n",ierror);
  332. ierror = OASISMCT::put_2d(OasisCoupler::fieldTypeLId,time,fieldLPJGtypeLData,nx,ny);
  333. if (ierror != OASISMCT::OASIS_Ok)
  334. dprintf(" OasisCoupler::couple_put TYPL - ierror: %i\n",ierror);
  335. ierror = OASISMCT::put_2d(OasisCoupler::fieldFracLId,time,fieldLPJGfracLData,nx,ny);
  336. if (ierror != OASISMCT::OASIS_Ok)
  337. dprintf(" OasisCoupler::couple_put FRACL - ierror: %i\n",ierror);
  338. // ecev3 - only send CO2 fluxes to TM5 if we are coupled
  339. if (TM5coupled) {
  340. ierror = OASISMCT::put_2d(OasisCoupler::fieldCfluxId,time,fieldLPJGCfluxData,nx,ny);
  341. if (ierror != OASISMCT::OASIS_Ok)
  342. dprintf(" OasisCoupler::couple_put CFLUX - ierror: %i\n",ierror);
  343. ierror = OASISMCT::put_2d(OasisCoupler::fieldNPPId,time,fieldLPJGNPPData,nx,ny);
  344. if (ierror != OASISMCT::OASIS_Ok)
  345. dprintf(" OasisCoupler::couple_put NPP - ierror: %i\n",ierror);
  346. }
  347. return 0;
  348. };