Commit 72b4be49595c2b2d3893f5de5164e8a24bd89a47

Authored by caveenj
1 parent 2b305993
Exists in master

Added english in line documentation

Showing 1 changed file with 76 additions and 41 deletions   Show diff stats
nc_rar.F
... ... @@ -4,14 +4,25 @@
4 4 * James Caveen - UQAR
5 5 * Janvier 2007
6 6 *
7   -* nc_rar.F: reconstruire les axes reduits
8   -* reduced axes reconstruction
9   -* Decompresse un champ de points mouilles et
10   -* reconstruit le champ 3D correspondant
  7 +* nc_rar.F: Reconstruire les axes reduits
  8 +** Decompresse un champ de points mouilles et
  9 +* reconstruit le champ 2D ou 3D correspondant
11 10 *
12   -* $Id: nc_rar.F,v 1.3 2007-02-14 14:43:34 caveenj Exp $
  11 +* Reduced Axes Reconstruction
  12 +* Rebuild a 2D or 3D field from data that has been compressed
  13 +* using the Compression by gathering algorithm
  14 +*
  15 +* See (Voir): http://www.cgd.ucar.edu/cms/eaton/cf-metadata/CF-current.html#gath
  16 +* for reference
  17 +*
  18 +* $Id: nc_rar.F,v 1.4 2007-04-19 19:03:17 caveenj Exp $
13 19 *
14 20 * $Log: not supported by cvs2svn $
  21 +* Revision 1.3 2007/02/14 14:43:34 caveenj
  22 +* Correction d'un bogue de calcul d'indices par l'ajout d'un test permettant
  23 +* de s'assurer que les limites min-max des axes du tableau de sortie soient
  24 +* respectees avant d'y ajouter une valeur.
  25 +*
15 26 *
16 27 *
17 28 *
... ... @@ -62,7 +73,7 @@
62 73 * V
63 74  
64 75 CALL ef_set_desc(id,'Reconstruire des axes reduits'//
65   - $ ' - reduced axes reconstruction' )
  76 + $ ' - Reduced Axes Reconstruction' )
66 77  
67 78 CALL ef_set_num_args(id, 2)
68 79 CALL ef_set_axis_inheritance(id, ABSTRACT,
... ... @@ -92,6 +103,17 @@
92 103 RETURN
93 104 END
94 105  
  106 +
  107 +*
  108 +*
  109 +* Fonction pour calculer les limites des axes X et Y
  110 +* du tableau de sortie
  111 +*
  112 +* Function to calculate the limits of the abstract X and Y axes of the
  113 +* result matrix
  114 +*
  115 +*
  116 +
95 117 subroutine nc_rar_result_limits(id)
96 118  
97 119 implicit none
... ... @@ -107,7 +129,6 @@
107 129 * V
108 130 INTEGER my_lo_x, my_hi_x, my_lo_y, my_hi_y
109 131 integer nx,ny
110   - CHARACTER*100 errtxt
111 132  
112 133 INTEGER arg_lo_ss(4,EF_MAX_ARGS), arg_hi_ss(4,EF_MAX_ARGS),
113 134 . arg_incr(4,EF_MAX_ARGS)
... ... @@ -119,6 +140,8 @@
119 140 * les proprietes de l'axe Z sont heritees du premier champ passe en argument
120 141 * lors de l'appel a la fonction nc_rar
121 142 *
  143 +* Properties of the Z axis are inherited from the grid of the first
  144 +* argument supplied to nc_rar()
122 145  
123 146 CALL ef_get_arg_subscripts(id, arg_lo_ss, arg_hi_ss, arg_incr)
124 147  
... ... @@ -127,6 +150,7 @@
127 150  
128 151 * Nos axes X et Y sont de type ABSTRACT, on les reindice donc a partir de 1
129 152 *
  153 +* Our X and Y axis ar of type ABSTRACT, so re-index starting from 1
130 154  
131 155 my_lo_x = 1
132 156 my_hi_x = nx
... ... @@ -145,21 +169,19 @@
145 169  
146 170 RETURN
147 171  
148   -
149   - 999 CONTINUE
150   -
151   - CALL EF_BAIL_OUT(id, errtxt)
152   -
153 172 END
154 173  
155 174  
156 175 *
157 176 *
158   -* Dans cette fonction on initialise un espace de travail
  177 +* Fonction pour initialiser un espace de travail
159 178 * qui contiendra les coordonnees reelles de l'axe wet
160 179 *
161 180 * Note: les coordonnees sont de type real*8
162 181 *
  182 +* Function to initialise a work vector where the actual coordinates
  183 +*(i.e., indices) of the compressed axis will be stored
  184 +*
163 185 subroutine nc_rar_work_size(id)
164 186  
165 187 implicit none
... ... @@ -173,9 +195,6 @@
173 195  
174 196 integer nxout
175 197  
176   - character*100 errtxt
177   -
178   -
179 198 INTEGER arg_lo_ss(4,EF_MAX_ARGS), arg_hi_ss(4,EF_MAX_ARGS),
180 199 $ arg_incr(4,EF_MAX_ARGS)
181 200  
... ... @@ -187,10 +206,14 @@
187 206 *
188 207 *Definition du tableau de travail XAX
189 208 *
190   -*
191 209 * Les coordonnees qui seront contenues dans xax sont en real*8
192 210 * donc, on double l'espace requis
193 211 *
  212 +*Define the work XAX work array
  213 +*
  214 +*Coordinates that will be stored there by the ef_get_coordinates() function
  215 +*are of type real*8, so we double up the required space
  216 +*
194 217 nxout = nxout * 2
195 218 call ef_set_work_array_dims(id,1,1,1,1,1,nxout,1,1,1)
196 219  
... ... @@ -198,8 +221,17 @@
198 221 end
199 222  
200 223 *
  224 +* Fonction calculant le resultat
  225 +*
201 226 * In this subroutine we compute the result
202 227 *
  228 +*Parameters:
  229 +* arg_1: dummy variable used to describe the target (2)3D grig
  230 +* arg_2: field to uncompress
  231 +* result: the resulting (2)3D field
  232 +* xax : work space to hold coordinates (indices)
  233 +*
  234 +
203 235 SUBROUTINE nc_rar_compute(id, arg_1, arg_2, result,xax)
204 236  
205 237 implicit none
... ... @@ -226,6 +258,13 @@
226 258 * On divise la dimension wrk1hix par 2 car dans la fonction
227 259 * d'allocation d'espace de travail, on a alloue deux fois
228 260 * plus d'espace pour tenir compte du fait que xax est real*8
  261 +*
  262 +* XAX is meant to hold the actual 3D cell coordinates
  263 +* We divide the wrk1hix dimension by 2 because the work array
  264 +* allocated in nc_rar_work_size() was twice the actual size required
  265 +* because coordinates are real*8 while nc_rar_work_size() allocates
  266 +* real*4
  267 +*
229 268 real*8 xax(wrk1lox:wrk1hix/2,wrk1loy:wrk1hiy,wrk1loz:wrk1hiz,
230 269 $ wrk1lot:wrk1hit)
231 270  
... ... @@ -260,26 +299,14 @@
260 299  
261 300 *
262 301 * Obtenir la liste des indices des points mouilles sur la grille 3D
263   -*
  302 +*
  303 +* Fetch the actual indices on the 3D grid
264 304 call ef_get_coordinates(id,arg,X_AXIS,arg_lo_ss(X_AXIS,
265 305 $ ARG2),arg_hi_ss(X_AXIS,ARG2),xax)
266 306  
267   -
268   -#if defined DEBUG
269   - write(6,*)'res_lo_ss(X_AXIS), res_hi_ss(X_AXIS)',
270   - & res_lo_ss(X_AXIS), res_hi_ss(X_AXIS)
271   -
272   - write(6,*)'res_lo_ss(Y_AXIS), res_hi_ss(Y_AXIS)',
273   - & res_lo_ss(Y_AXIS), res_hi_ss(Y_AXIS)
274   -
275   - write(6,*)'res_lo_ss(Z_AXIS), res_hi_ss(Z_AXIS)',
276   - & res_lo_ss(Z_AXIS), res_hi_ss(Z_AXIS)
277   -
278   - write(6,*)'res_lo_ss(T_AXIS), res_hi_ss(T_AXIS)',
279   - & res_lo_ss(T_AXIS), res_hi_ss(T_AXIS)
280   -#endif
281 307 C
282 308 C Initialiser le champ de sortie a des manquants
  309 +C Initialise output field to missing
283 310 C
284 311  
285 312 do i=res_lo_ss(X_AXIS), res_hi_ss(X_AXIS)
... ... @@ -295,16 +322,9 @@ C
295 322  
296 323  
297 324  
298   -C
299   -C Reconstruction des axes de la grille 3D
300   -C et des valeurs du champ sur cette grille
301   -C
302   -C
303   -
304   -
305   -
306 325 *
307 326 * Calcul des dimensions necessaires au calcul des coordonnees
  327 +* Compute constants required to decompress
308 328 *
309 329  
310 330 dimxy = res_hi_ss(X_AXIS)*res_hi_ss(Y_AXIS)
... ... @@ -314,6 +334,12 @@ C
314 334 *Calcul de l'indice de depart j et k du champ compresse
315 335 *cet indice demeure constant dans le calcul
316 336 * et est probablement = -111 ( i.e., non defini)
  337 +*
  338 +* Compute the starting index for j and k (all data is stored
  339 +* along x and t in compressed format)
  340 +* Theses indices remain constant throughout calculation and are
  341 +* most likely == to -111 (i.e., undefined)
  342 +
317 343 j2 = arg_lo_ss(Y_AXIS,ARG2)
318 344 k2 = arg_lo_ss(Z_AXIS,ARG2)
319 345  
... ... @@ -325,7 +351,12 @@ C
325 351 * correspondante dans le champ qui avait ete cree lors
326 352 * de la compression des axes (arg_2)
327 353 *
328   -
  354 +* Here, we loop on the compressed field coordinates in order to
  355 +* compute the i,j,k coordinates of the 3D field
  356 +* from the 1D coordinates
  357 +* We then assing to result(i,j,k) the corredsonding value in the
  358 +* compressed field
  359 +*
329 360 do i2 = arg_lo_ss(X_AXIS,ARG2),arg_hi_ss(X_AXIS,ARG2)
330 361 indice = int(xax(i2,1,1,1))
331 362 indz = (indice - 1)/dimxy
... ... @@ -339,6 +370,9 @@ C
339 370 * On s'assure que les indices calcules sont a
340 371 * l'interieur du domaine demande
341 372 *
  373 +* Making sure that the computed indices fall within
  374 +* the requested region
  375 +*
342 376 if( (indx .ge. res_lo_ss(X_AXIS) .and.
343 377 & indx .le. res_hi_ss(X_AXIS)) .and.
344 378 & (indy .ge. res_lo_ss(Y_AXIS) .and.
... ... @@ -349,6 +383,7 @@ C
349 383  
350 384 *
351 385 * On repete l'operation pour chaque pas de temps demande
  386 +* Repeat for all requested time step
352 387 *
353 388 l2 = arg_lo_ss(T_AXIS,ARG2)
354 389  
... ...