Oasis3 4.0.2
|
00001 SUBROUTINE inidya 00002 C**** 00003 C ***************************** 00004 C * OASIS ROUTINE - LEVEL 0 * 00005 C * ------------- ------- * 00006 C ***************************** 00007 C 00008 C**** *inidya* - Initialize simulated dynamic allocation 00009 C 00010 C Purpose: 00011 C ------- 00012 C Set up pseudo-dynamic allocation of arrays. 00013 C Define adresses and lengths of small arrays in big arrays 00014 C 00015 C** Interface: 00016 C --------- 00017 C *CALL* *inidya* 00018 C 00019 C Input: 00020 C ----- 00021 C None 00022 C 00023 C Output: 00024 C ------ 00025 C None 00026 C 00027 C Workspace: 00028 C --------- 00029 C ineed 00030 C 00031 C Externals: 00032 C --------- 00033 C chkmem 00034 C 00035 C Reference: 00036 C --------- 00037 C See OASIS manual (1995) 00038 C 00039 C History: 00040 C ------- 00041 C Version Programmer Date Description 00042 C ------- ---------- ---- ----------- 00043 C 2.0 L. Terray 95/08/23 created 00044 C 2.3 S. Valcke 99/04/30 added: printing levels 00045 C 00046 C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00047 C 00048 C* ---------------- Include files and USE of modules--------------------------- 00049 C 00050 USE mod_unit 00051 USE mod_parameter 00052 USE mod_string 00053 USE mod_memory 00054 USE mod_printing 00055 C 00056 C* ---------------------------- Local declarations ---------------------- 00057 C 00058 INTEGER (kind=ip_intwp_p) il_memtot(2) 00059 INTEGER (kind=ip_intwp_p), DIMENSION(:), ALLOCATABLE :: 00060 $ nsizold_grid_aux, nsiznew_grid_aux, nadrold_grid_aux, 00061 $ nadrnew_grid_aux 00062 C 00063 C* ---------------------------- Poema verses ---------------------------- 00064 C 00065 C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00066 C 00067 IF (nlogprt .GE. 2) THEN 00068 WRITE (UNIT = nulou,FMT = *)' ' 00069 WRITE (UNIT = nulou,FMT = *)' ROUTINE inidya - Level 0' 00070 WRITE (UNIT = nulou,FMT = *)' ************** *******' 00071 WRITE (UNIT = nulou,FMT = *)' ' 00072 WRITE (UNIT = nulou,FMT = *)' Setup memory dynamic allocation' 00073 WRITE (UNIT = nulou,FMT = *)' ' 00074 CALL FLUSH(nulou) 00075 ENDIF 00076 C 00077 C* This routine is called if one field (at least) goes through Oasis 00078 C 00079 IF (lg_oasis_field) THEN 00080 C 00081 C* 1. Set up memory dynamic allocation 00082 C -------------------------------- 00083 C 00084 C* Allocation of local arrays 00085 C 00086 ALLOCATE (nsizold_grid_aux(maxval(ig_grid_nbrbf))) 00087 nsizold_grid_aux(:)=0 00088 ALLOCATE (nsiznew_grid_aux(maxval(ig_grid_nbraf))) 00089 nsiznew_grid_aux(:)=0 00090 ALLOCATE (nadrold_grid_aux(maxval(ig_grid_nbrbf))) 00091 nadrold_grid_aux(:)=0 00092 ALLOCATE (nadrnew_grid_aux(maxval(ig_grid_nbraf))) 00093 nadrnew_grid_aux(:)=0 00094 C 00095 C* Zero size and adress arrays 00096 C 00097 CALL izero (nsizold, ig_nfield) 00098 CALL izero (nsiznew, ig_nfield) 00099 CALL izero (nadrold, ig_nfield) 00100 CALL izero (nadrnew, ig_nfield) 00101 CALL izero (nadrold_grid, ig_nfield) 00102 CALL izero (nadrnew_grid, ig_nfield) 00103 C 00104 C* Zero main storage area 00105 C 00106 C* - Integer arrays: masks 00107 C 00108 CALL izero (mskold, ig_maxold_grid) 00109 CALL izero (msknew, ig_maxnew_grid) 00110 C 00111 C* - Real arrays: fields, grids, surfaces 00112 C 00113 CALL szero (fldold, ig_maxold) 00114 CALL szero (fldnew, ig_maxnew) 00115 CALL szero (xgrold, ig_maxold_grid) 00116 CALL szero (ygrold, ig_maxold_grid) 00117 CALL szero (xgrnew, ig_maxnew_grid) 00118 CALL szero (ygrnew, ig_maxnew_grid) 00119 CALL szero (surold, ig_maxold_grid) 00120 CALL szero (surnew, ig_maxnew_grid) 00121 00122 C 00123 C* Get the sizes for each small array 00124 C 00125 DO 110 jf = 1, ig_nfield 00126 nsizold(jf) = nlonbf(jf) * nlatbf(jf) 00127 nsiznew(jf) = nlonaf(jf) * nlataf(jf) 00128 nsizold_grid_aux (ig_grid_nbrbf(jf)) = 00129 $ nlonbf(jf) * nlatbf(jf) 00130 nsiznew_grid_aux (ig_grid_nbraf(jf)) = 00131 $ nlonaf(jf) * nlataf(jf) 00132 110 CONTINUE 00133 C 00134 C* Get the pointers for each small array 00135 C 00136 nadrold(1) = 1 00137 nadrnew(1) = 1 00138 nadrold_grid_aux(1) = 1 00139 nadrnew_grid_aux(1) = 1 00140 nadrold_grid(1) = 1 00141 nadrnew_grid(1) = 1 00142 00143 DO ib = 2, maxval(ig_grid_nbrbf) 00144 nadrold_grid_aux(ib) = nadrold_grid_aux(ib-1) + 00145 $ nsizold_grid_aux(ib-1) 00146 ENDDO 00147 DO ib = 2, maxval(ig_grid_nbraf) 00148 nadrnew_grid_aux(ib) = nadrnew_grid_aux(ib-1) + 00149 $ nsiznew_grid_aux(ib-1) 00150 ENDDO 00151 00152 DO 120 jf = 2, ig_nfield 00153 nadrold(jf) = nadrold(jf-1) + nsizold(jf-1) 00154 nadrnew(jf) = nadrnew(jf-1) + nsiznew(jf-1) 00155 nadrold_grid(jf) = nadrold_grid_aux(ig_grid_nbrbf(jf)) 00156 nadrnew_grid(jf) = nadrnew_grid_aux(ig_grid_nbraf(jf)) 00157 120 CONTINUE 00158 C 00159 C* Print memory required for field and grid arrays 00160 C 00161 il_memtot(1) = ((ig_maxold + 3*ig_maxold_grid)*ip_realwp_p 00162 $ + ig_maxold_grid*ip_intwp_p)/1000 00163 il_memtot(2) = ((ig_maxnew + 3*ig_maxnew_grid)*ip_realwp_p 00164 $ + ig_maxnew_grid*ip_intwp_p)/1000 00165 C 00166 IF (nlogprt .GE. 1) THEN 00167 WRITE (UNIT = nulou,FMT = 1001) il_memtot(1), il_memtot(2) 00168 ENDIF 00169 1001 FORMAT(1H ,5X, 00170 $ 'Memory (kB) requested for source field and grid arrays', 00171 $ I10,/, 1H ,5X, 00172 $ 'Memory (kB) requested for target field and grid arrays', I10) 00173 C 00174 C* 2. End of routine 00175 C -------------- 00176 C 00177 DEALLOCATE (nsizold_grid_aux) 00178 DEALLOCATE (nsiznew_grid_aux) 00179 DEALLOCATE (nadrold_grid_aux) 00180 DEALLOCATE (nadrnew_grid_aux) 00181 C 00182 IF (nlogprt .GE. 2) THEN 00183 WRITE (UNIT = nulou,FMT = *)' ' 00184 WRITE (UNIT = nulou,FMT = *) 00185 $ ' --------- End of ROUTINE inidya ---------' 00186 CALL FLUSH (nulou) 00187 ENDIF 00188 ENDIF 00189 RETURN 00190 END 00191 00192