source: trunk/src/sinobad.h @ 64

Last change on this file since 64 was 64, checked in by jbrlod, 13 years ago

make kt the effective time step

  • Property svn:eol-style set to native
File size: 29.4 KB
Line 
1
2
3///////////////////////////////////////////////////////////////////////////////
4// define, globales, fonctions perso (obligatoire et autres) ...
5// mohamed.berrada@upmc.fr
6///////////////////////////////////////////////////////////////////////////////
7#include"../include/ncutil.h"//netcdf
8#define key_zco
9#include"../include/phy_cst_file.h"
10#include"../include/namelist.h"
11//#define PATH_NCFILES "/usr/home/mblod/neuro/nemo/nemo_opa/TRY/modipsl/config/GYRE/EXP00"
12#define PATH_NCFILES "../data_in"
13#include"../include/meshmask.h"
14
15// For PPCA
16/*double shfs_ta[NZ*NY*NX][NPCA];
17double moy_ta[NZ*NY*NX];
18double stdev_ta[NPCA];
19#define shfs_ta( i, j, k ,n )  (shfs_ta[(i)*(NY*NZ)+(j)*(NZ)+(k)][(n)]) // shape functions
20#define moy_ta( i, j, k )  (moy_ta[(i)*(NY*NZ)+(j)*(NZ)+(k)]) // mean
21void load_shape_func (int argc, char *argv[]);  // load PCA axes from file with mean
22void load_stdev_pac (int argc, char *argv[]);  // load stdev from file
23void load_mean (int argc, char *argv[]);  // load mean
24*/
25////#define bmask( i, j )  (tmask( i, j ,0))  // ! elliptic equation is written at t-point
26int tniter[TA+TU]; // nbre d'iterations pour backward de solsor_dynspg_flt.h
27int ndiag_rst=0;  // diagnostic restart if =1
28
29//Arrays for neuler=1 (neuler=0::Euler 1st time step)
30#define tb_neuler1( i, j, k) (tb_neuler1[(k)*(NY*NX)+(j)*(NX)+(i)])
31#define sb_neuler1( i, j, k) (sb_neuler1[(k)*(NY*NX)+(j)*(NX)+(i)])
32#define ub_neuler1( i, j, k) (ub_neuler1[(k)*(NY*NX)+(j)*(NX)+(i)])
33#define vb_neuler1( i, j, k) (vb_neuler1[(k)*(NY*NX)+(j)*(NX)+(i)])
34#define sshb_neuler1( i, j) (sshb_neuler1[(j)*(NX)+(i)])
35#define rotn_at_TU( i, j, k) (rotn_at_TU[(k)*(NY*NX)+(j)*(NX)+(i)])
36#define hdivn_at_TU( i, j, k) (hdivn_at_TU[(k)*(NY*NX)+(j)*(NX)+(i)])
37#define gcx_at_TU( i, j) (gcx_at_TU[(j)*(NX)+(i)])
38double  tb_neuler1[NZ*NY*NX]; //
39double  sb_neuler1[NZ*NY*NX]; //
40double  ub_neuler1[NZ*NY*NX]; //
41double  vb_neuler1[NZ*NY*NX]; //
42double  sshb_neuler1[NY*NX]; //
43double  rotn_at_TU[NZ*NY*NX]; //
44double  hdivn_at_TU[NZ*NY*NX]; //
45double  gcx_at_TU[NY*NX]; //
46
47void true_target_in_tab(int argc, char *argv[]); // charge YS_*a_c(0,i,j,k) dans true_*a_c(i,j,k)
48void normsup_alla_c(); // diagnostic of minimization
49double gdsr[NZ];
50int nksr;
51void xtraqsr_init();// init of solar radiation penetration
52double Ytold; //pour voir se pas de temps
53double ktinit; //premier pas ocean
54#   define  rdttra( k ) rdt
55double r2dt;
56
57double   atfp1       =    1. - 2. * atfp;// !: asselin time filter coeff. (atfp1= 1-2*atfp)
58//------->zdfmxl
59double      avt_c = 5.e-4; //  ! Kz criterion for the turbocline depth
60double      rho_c = 0.01;//      ! density criterion for mixed layer depth
61
62double ppgphi0 = 29.; // latitude of first raw column T-point
63//latitude for the Coriolis or Beta parameter
64
65//mode de sauvegarde (==0 3D, ==1 2D surface)
66short savemode=0;
67
68
69int n_zdfexp=3;
70int jphgr_msh=5;//pour ff :beta-plane with regular grid-spacing and rotated domain (GYRE config)
71// a faire
72/*nyear   =   ndastp / 10000 : current year
73  nmonth    : current month of the year nyear
74  nday_year : current day of the year nyea
75  ndastp    : = nyear*10000 + nmonth*100 + nday*/
76
77void cal_ff();
78void xdisplay() ; 
79void xistate_gyre();
80void xistate_yao_file(char * pth_file_yao); // a faire
81void xdom_init();
82void xflt_rst();
83void xsolmat_init();
84void xistate_init(int argc, char *argv[]);
85void xrst_save(int argc, char *argv[]);
86
87//////////////////////////////////////////////////////////////
88// Les fonctions OBLIGATOIRES
89//_____________________________________________________________________________
90void appli_start (int argc, char *argv[])
91{       // permet si besoin de prendre la main des le debut de l'appl;
92
93  printf("////////////////////////////////////////////////////////////////////////\n");
94  printf("//                       NEMO/YAO PROJECT                             //\n");
95  printf("//                     M. Berrada 02-2009                            //\n");
96  printf("//                  LOCEAN-IPSL.UPMC (Paris 6)                        //\n");
97  printf("//====================================================================//\n");
98  printf("\n");
99#ifdef K_SOLSORYAO
100  printf("option SOLSORYAO enable\n");
101#else
102  printf("option SOLSORYAO disable\n");
103#endif
104#ifdef K_OPTIMORDER
105  printf("option OPTIMORDER enable\n");
106#else
107  printf("option OPTIMORDER disable\n");
108#endif
109
110  //Vérification du type de réel utilisé
111  //A modifier - pas génial
112#ifdef YFLOAT
113#ifndef YYFLOAT
114  printf("Incoherent real type between O_REAL option and ncutil.h\n");
115  exit(1);
116#endif
117#endif
118#ifdef YDOUBLE
119#ifndef YYDOUBLE
120  printf("Incoherent real type between O_REAL option and ncutil.h\n");
121  exit(1);
122#endif
123#endif
124
125 
126  for (int i=0;i<TA+TU;i++) tniter[i]=0;//nmax;// pour backward de solsor_dynspg_flt.h
127  phy_cst();
128  xinit_mesh_mask_nc();// lire le fichier mesh_mask.nc
129  cal_ff();
130  xdom_init();
131  xsolmat_init();
132  xflt_rst();
133  // xistate_init(); basculer dans .i
134  xdisplay();
135  xtraqsr_init();
136  ktinit=0; //A mettre dans la namelist ????
137}
138//____________________________________________________________________________
139int test=0;
140void before_it (int nit) // permet d'intervenir si besoin avant une iteration
141{
142  // static int test=0;
143  FILE *p;
144  char* c="a";
145  if(!test) c="w";
146  test=1;
147  p=fopen("cost.dat",c);
148  fprintf(p,"%23.16e\n",YTotalCost);
149  fclose(p);
150  Ytold=Yt;
151  kt=ktinit;
152}
153//_____________________________________________________________________________
154void cost_function (int pdt)
155{                       // fonction de cout (si les standards ne conviennent pas)
156}
157//_____________________________________________________________________________
158void adjust_target ()
159{                       // fonction d'ajustement (si la standard ne convient pas)
160}
161//_____________________________________________________________________________
162void after_it (int nit)
163{
164  xdisplay();
165}
166//_____________________________________________________________________________
167void forward_before (int ctrp)
168{       // permet d'intervenir si besoin avant le forward
169 
170
171  kt=ktinit + (Yt-TU);
172  printf("kt=%lf\n",kt);
173    if(Yt==TU+1 && neuler==0)
174      r2dt=rdt;
175    else
176      r2dt=2.*rdt; 
177  }
178//_____________________________________________________________________________
179void forward_after (int ctrp)
180{                       // permet d'intervenir si besoin aprÚs le forward
181  //printf("neuler=%d\n",neuler);
182}
183//_____________________________________________________________________________
184void backward_before (int ctrp)
185{                       // permet d'intervenir si besoin avant le backward
186
187    if( ndiag_rst==1){
188      printf("backward_before:: ndiag_rst will be =0\n");
189      exit(99);
190    }
191    if(Yt==TU+1 && neuler==0)
192      r2dt=rdt;
193    else
194      r2dt=2.*rdt; 
195}
196//_____________________________________________________________________________
197void backward_after (int ctrp)
198{                       // permet d'intervenir si besoin apres le backward
199}
200//_____________________________________________________________________________
201short select_io(int indic, char *nmmod, int sortie, int iaxe, int jaxe, int kaxe, int pdt, YREAL *val)
202{                       // Pour faire des selections sur les fonctions d'entrees sorties de Yao ou autre en generale.
203                        // Doit retourner 1 si l'element dont les caracteristiques sont passes en parametre doit
204                        // etre retenu, pris, selectionne ; et 0 sinon
205                        // indic permet de savoir de quelle instance provient l'appel :
206                        // =YIO_LOADSTATE        => appel via loadstate
207                        // =YIO_SAVESTATE        => appel via savestate
208                        // =YIO_LOADOBS    => appel via loadobs
209                        // =YIO_OUTOOBS    => appel via outoobs
210
211   if(indic==YIO_SAVESTATE && !strcmp(nmmod,"tb") && savemode){
212    if(kaxe==0 )
213      return(1);
214    else 
215      return(0);
216      }
217   
218  /*  if(indic==YIO_OUTOOBS){
219    if(iaxe==9 && jaxe==9 )
220      return(1);
221    else
222      return(0);
223      }*/
224  return(1);
225}
226//======================== Fin des foncts obligatoires =========================
227//==============================================================================
228
229//Les autres fonctions
230
231//_____________________________________________________________________________
232void    xdisplay()
233{
234  normsup_alla_c();
235}
236
237//_____________________________________________________________________________
238#define hu( i, j )  (hu[(j)*(NX)+(i)])
239#define hv( i, j )  (hv[(j)*(NX)+(i)])
240#define hur( i, j )  (hur[(j)*(NX)+(i)])
241#define hvr( i, j )  (hvr[(j)*(NX)+(i)])
242
243double hu[NY*NX]; // xdom_init
244double hv[NY*NX]; // xdom_init
245double hur[NY*NX]; // xdom_init
246double hvr[NY*NX]; // xdom_init
247
248void xdom_init(){
249  for(int j=0;j<NY;j++)
250    for(int i=0;i<NX;i++){
251      hu(i,j) =0.;
252      hv(i,j) =0.;
253      for(int k=0;k<NZ;k++){
254        hu(i,j) = hu(i,j) + fse3u(i,j,k) * umask(i,j,k);
255        hv(i,j) = hv(i,j) + fse3v(i,j,k) * vmask(i,j,k);
256      }
257     
258      //      ! Inverse of the local depth
259      hur(i,j) = fse3u(i,j,0);             //! Lower bound : thickness of the first model level
260      hvr(i,j) = fse3v(i,j,0);
261      for(int k=1;k<NZ;k++){ // ! Sum of the vertical scale factors
262        hur(i,j) = hur(i,j) + fse3u(i,j,k) * umask(i,j,k);
263        hvr(i,j) = hvr(i,j) + fse3v(i,j,k) * vmask(i,j,k);
264      }
265      // ! Cte and mask the inverse of the local depth
266      hur(i,j) = 1. / hur(i,j) * umask(i,j,0);
267      hvr(i,j) = 1. / hvr(i,j) * vmask(i,j,0);
268     
269    }
270}
271
272//_____________________________________________________________________________
273#define gcp( i, j, k ,t )  (gcp[(j)*(NX)+(i)][(k)][(t)]) // a t0
274#define gcdmat( i, j ,t )  (gcdmat[(j)*(NX)+(i)][(t)])
275#define gcdprc( i, j ,t )  (gcdprc[(j)*(NX)+(i)][(t)])
276#define gccd( i, j ,t )  (gccd[(j)*(NX)+(i)][(t)])
277
278#define gcx( i, j )  (gcx[(i)][(j)])
279double gcx[NX][NY];   // xsolsor
280#define G_gcx( i , j )  (G_gcx[(j)*(NX)+(i)])
281double G_gcx[NY*NX];   // xsolsor
282#define G_gcx0( i , j )  (G_gcx0[(j)*(NX)+(i)])
283double G_gcx0[NY*NX];   // xsolsor
284#define Ytb_gcx( i , j )  (Ytb_gcx[(j)*(NX)+(i)])
285double Ytb_gcx[NY*NX];   // xsolsor
286#define gcr( i, j )  (gcr[(j)*(NX)+(i)])
287double gcr[NY*NX];   // xsolsor
288
289double gcp[NY*NX][4][2]; // xsolmat_init
290double gcdmat[NY*NX][2]; // xsolmat_init
291double gcdprc[NY*NX][2]; // xsolmat_init
292double gccd[NY*NX][2];   // xsolmat_init
293
294int nn_rstssh=0;
295void xflt_rst(){
296  for(int j=0;j<NY;j++)
297    for(int i=0;i<NX;i++){
298      YS_gcx_dynspg_flt(0,i,j,TU-1)=0.;   YS_gcx_dynspg_flt(0,i,j,TU)=0.;
299      YS_gcx2(0,i,j,TU-1)=0.;   YS_gcx2(0,i,j,TU)=0.;
300      gcx(i,j)=0.;
301    }
302   if( nn_rstssh == 1 ) {
303    for(int j=0;j<NY;j++)
304      for(int i=0;i<NX;i++){
305        YS_sshb(0,i,j,TU)=0.;   YS_sshn(0,i,j,TU)=0.;
306      }
307  }
308}
309
310//_____________________________________________________________________________
311void xsolmat_init(){
312  //      ! initialize to zero
313  double  z2dt_t0,z2dt_t1;//zcoef_t0 = 0.e0,zcoef_t1 = 0.e0;
314  for(int j=0;j<NY;j++)
315    for(int i=0;i<NX;i++){// pour neuler=0
316      gcp(i,j,0,0) = 0.e0;  gcp(i,j,0,1) = 0.e0;
317      gcp(i,j,1,0) = 0.e0;  gcp(i,j,1,1) = 0.e0;
318      gcp(i,j,2,0) = 0.e0;  gcp(i,j,2,1) = 0.e0;
319      gcp(i,j,3,0) = 0.e0;  gcp(i,j,3,1) = 0.e0;
320
321      gcdprc(i,j,0) = 0.e0;  gcdprc(i,j,1) = 0.e0;
322      gcdmat(i,j,0) = 0.e0;  gcdmat(i,j,1) = 0.e0;
323    }
324  z2dt_t0 = rdt;
325  z2dt_t1 = 2.*rdt;
326  double zcoef_t0,zcoefs_t0,zcoefw_t0,zcoefe_t0,zcoefn_t0;
327  double zcoef_t1,zcoefs_t1,zcoefw_t1,zcoefe_t1,zcoefn_t1;
328  //      ! defined the coefficients for free surface elliptic system
329  for(int j=1;j<NY-1;j++)
330    for(int i=1;i<NX-1;i++){
331      zcoef_t0 = z2dt_t0 * z2dt_t0 * grav * rnu * bmask(i,j);
332      zcoefs_t0 = -zcoef_t0 * hv(,j-1) * e1v(,j-1) / e2v(,j-1);//    ! south coefficient
333      zcoefw_t0 = -zcoef_t0 * hu(i-1,) * e2u(i-1,) / e1u(i-1,);//    ! west coefficient
334      zcoefe_t0 = -zcoef_t0 * hu(,) * e2u(,) / e1u(,);//    ! east coefficient
335      zcoefn_t0 = -zcoef_t0 * hv(,) * e1v(,) / e2v(,);//    ! north coefficient
336      zcoef_t1 = z2dt_t1 * z2dt_t1 * grav * rnu * bmask(i,j);
337      zcoefs_t1 = -zcoef_t1 * hv(,j-1) * e1v(,j-1) / e2v(,j-1);//    ! south coefficient
338      zcoefw_t1 = -zcoef_t1 * hu(i-1,) * e2u(i-1,) / e1u(i-1,);//    ! west coefficient
339      zcoefe_t1 = -zcoef_t1 * hu(,) * e2u(,) / e1u(,);//    ! east coefficient
340      zcoefn_t1 = -zcoef_t1 * hv(,) * e1v(,) / e2v(,);//    ! north coefficient
341
342      gcp(i,j,0,0) = zcoefs_t0;  gcp(i,j,0,1) = zcoefs_t1;
343      gcp(i,j,1,0) = zcoefw_t0;  gcp(i,j,1,1) = zcoefw_t1;
344      gcp(i,j,2,0) = zcoefe_t0;  gcp(i,j,2,1) = zcoefe_t1;
345      gcp(i,j,3,0) = zcoefn_t0;  gcp(i,j,3,1) = zcoefn_t1;
346      gcdmat(i,j,0) = e1t(i,j) * e2t(i,j) * bmask(i,j)    //         ! diagonal coefficient
347        - zcoefs_t0 -zcoefw_t0 -zcoefe_t0 -zcoefn_t0;
348      gcdmat(i,j,1) = e1t(i,j) * e2t(i,j) * bmask(i,j)    //         ! diagonal coefficient
349        - zcoefs_t1 -zcoefw_t1 -zcoefe_t1 -zcoefn_t1;
350 
351   }
352   //  ! SOR and PCG solvers
353  for(int j=0;j<NY;j++)
354    for(int i=0;i<NX;i++){
355      if( bmask(i,j) != 0 ){
356        gcdprc(i,j,0) = 1.e0 / gcdmat(i,j,0);
357        gcdprc(i,j,1) = 1.e0 / gcdmat(i,j,1);
358      }
359    }
360         
361  for(int j=0;j<NY;j++)
362    for(int i=0;i<NX;i++){
363      gcp(i,j,0,0) = gcp(i,j,0,0) * gcdprc(i,j,0); gcp(i,j,0,1) = gcp(i,j,0,1) * gcdprc(i,j,1);
364      gcp(i,j,1,0) = gcp(i,j,1,0) * gcdprc(i,j,0); gcp(i,j,1,1) = gcp(i,j,1,1) * gcdprc(i,j,1);
365      gcp(i,j,2,0) = gcp(i,j,2,0) * gcdprc(i,j,0); gcp(i,j,2,1) = gcp(i,j,2,1) * gcdprc(i,j,1);
366      gcp(i,j,3,0) = gcp(i,j,3,0) * gcdprc(i,j,0); gcp(i,j,3,1) = gcp(i,j,3,1) * gcdprc(i,j,1);
367      gccd(i,j,0) = sor * gcp(i,j,1,0); gccd(i,j,1) = sor * gcp(i,j,1,1);
368    }
369}
370
371//_____________________________________________________________________________
372void xistate_init(int argc, char *argv[]){
373  int itest=atoi(argv[1]);
374  if(itest==1){// from restart file
375    printf("start from rest_file\n ");
376    neuler=0;//=1;// Restart from a file // Set time-step indicator at nit000 (leap-frog)
377    // ifdef YE_*a_c alors *a=*b=*a_c
378    char rest_file[200];
379    if (argc!=3)
380      {
381        printf("\nncf file for restart not specified in command xistate_init\n");
382        exit(1);
383      }
384    else
385      {
386        strcpy(rest_file,argv[2]);
387      }
388    //char const    *rest_file    = PATH_NCFILES"/rst3Yao.nc";//GYRE_00000003_restart.nc";
389    int rest_file_id;
390    rest_file_id=Ouvre_nc(rest_file);
391    xistate_rest_file(rest_file_id);
392    nc_close( rest_file_id);
393    //printf("kt=%f, ndastp=%f, adatrj=%f",kt,ndastp,adatrj);
394
395    for(int i=0;i<NX;i++)
396      for(int j=0;j<NY;j++){
397        for(int k=0;k<NZ;k++){
398          YS_ua_c(0,i,j,k)=YS_ua(0,i,j,k,TU);
399          YS_va_c(0,i,j,k)=YS_va(0,i,j,k,TU);
400          YS_ta_c(0,i,j,k)=YS_ta(0,i,j,k,TU);
401          YS_sa_c(0,i,j,k)=YS_sa(0,i,j,k,TU);
402
403          tb_neuler1(i,j,k)=YS_tb(0,i,j,k,TU);
404          sb_neuler1(i,j,k)=YS_sb(0,i,j,k,TU);
405          ub_neuler1(i,j,k)=YS_ub(0,i,j,k,TU);
406          vb_neuler1(i,j,k)=YS_vb(0,i,j,k,TU);
407          rotn_at_TU( i, j, k)=YS_rotn(0,i,j,k,TU);
408          hdivn_at_TU( i, j, k)=YS_hdivn(0,i,j,k,TU);
409        }
410        YS_sshn_c(0,i,j)=YS_sshn(0,i,j,TU);     
411        sshb_neuler1(i,j)=YS_sshb(0,i,j,TU);
412        gcx_at_TU( i, j)=YS_gcx2(0,i,j,TU);
413     }
414  }
415  else if (itest==2){
416    neuler=0;//
417    xistate_gyre(); // GYRE  configuration : start from pre-defined temperature
418    //            and salinity fields
419  }
420  else if (itest==3){
421    neuler=0;//
422    xistate_yao_file("data_in/file_yao/"); // GYRE  configuration : start from pre-defined temperature
423    //            and salinity fields
424  }
425}
426
427//_____________________________________________________________________________
428void xeos_init(){
429}
430
431//_____________________________________________________________________________
432void xistate_gyre(){
433  printf("start from gyre analytic initialization\n");
434  for(int i=0;i<NX;i++){
435    for(int j=0;j<NY;j++){
436      YS_sshn(0,i,j,TU)=0.;
437      YS_sshb(0,i,j,TU)=0.;
438      YS_gcx2(0,i,j,TU)=0.;
439      YS_gcx2(0,i,j,TU-1)=0.;
440      for(int k=0;k<NZ;k++){
441        YS_ua_c(0,i,j,k)=0.;
442        YS_ua(0,i,j,k,TU)=0.;
443        YS_ub(0,i,j,k,TU)=0.;
444        YS_va_c(0,i,j,k)=0.;
445        YS_va(0,i,j,k,TU)=0.;
446        YS_vb(0,i,j,k,TU)=0.;
447        YS_rotn(0,i,j,k,TU)=0.;
448        YS_rotn(0,i,j,k,TU-1)=0.;
449        YS_hdivn(0,i,j,k,TU)=0.;
450        YS_hdivn(0,i,j,k,TU-1)=0.;
451        YS_ta_c(0,i,j,k) = (16.-12.*tanh((fsdept(i,j,k)-400.)/700.))
452          * (-tanh((500.-fsdept(i,j,k))/150.)+1.)/2.
453          + (15.*(1.-tanh((fsdept(i,j,k)-50.)/1500.))-1.4*tanh((fsdept(i,j,k)-100.)/100.) 
454             + 7.*(1500.-fsdept(i,j,k))/1500.) 
455          *(-tanh((fsdept(i,j,k)-500.)/150.)+1.)/2.;
456        YS_ta_c(0,i,j,k) = YS_ta_c(0,i,j,k)* tmask(i,j,k);
457        YS_ta(0,i,j,k,TU) = YS_ta_c(0,i,j,k);
458        YS_tb(0,i,j,k,TU) = YS_ta_c(0,i,j,k);
459       
460        YS_sa_c(0,i,j,k) = (36.25-1.13*tanh((fsdept(i,j,k)-305.)/460.))
461          *(-tanh((500.-fsdept(i,j,k))/150.)+1.)/2.
462          +(35.55+1.25*(5000.-fsdept(i,j,k))/5000.
463            -1.62*tanh((fsdept(i,j,k)-60.)/650.)
464            +0.2*tanh((fsdept(i,j,k)-35.)/100.)
465            +0.2*tanh((fsdept(i,j,k)-1000.)/5000.))
466          *(-tanh((fsdept(i,j,k)-500.)/150.)+1.)/2.;
467        YS_sa_c(0,i,j,k) = YS_sa_c(0,i,j,k)*tmask(i,j,k);
468        YS_sa(0,i,j,k,TU) = YS_sa_c(0,i,j,k);
469        YS_sb(0,i,j,k,TU) = YS_sa_c(0,i,j,k);
470
471        rotn_at_TU( i, j, k)=YS_rotn(0,i,j,k,TU);
472        hdivn_at_TU( i, j, k)=YS_hdivn(0,i,j,k,TU);
473
474      }   
475      YS_sshn_c(0,i,j)=YS_sshn(0,i,j,TU);       
476      gcx_at_TU( i, j)=YS_gcx2(0,i,j,TU);
477    }
478  }
479}
480
481void xchangesavemode(int argc, char *argv[]){
482  short newmode=atoi(argv[1]);
483  savemode=newmode;
484
485}
486
487//_____________________________________________________________________________
488void xistate_yao_file(char * pth_file_yao){ // a faire
489  /*  printf("start from yao file\n");
490  FILE *pf;
491  char *file_yao;
492  sprintf(file_yao,"%stb.dat",pth_file_yao);
493  pf=fopen(file_yao,'r');
494  fscanf(p,"%lf",);
495  fclose(p);
496 for(int j=0;j<NY;j++)
497    for(int i=0;i<NX;i++){
498      for(int k=0;k<NZ;k++){
499        YS_ua_c(0,i,j,k)=0.;
500        YS_va_c(0,i,j,k)=0.;
501        YS_ta_c(0,i,j,k) =;
502        YS_sa_c(0,i,j,k) =;
503      }   
504      YS_sshn_c(0,i,j)=;
505    }*/
506}
507//_____________________________________________________________________________
508void xtraqsr_init(){// init of solar radiation penetration
509  //! z-coordinate with or without partial step : same w-level everywhere inside the ocean
510  for(int k=0;k<NZ;k++) gdsr[k] = 0.e0;
511  for(int k=0;k<NZ;k++) {
512    double zdp1 = -gdepw_0[k]; //#define fsdepw( i , j , k )  gdepw_0[k]
513    gdsr[k] = ro0cpr*(rabs*exp(zdp1/xsi1)+(1.-rabs)*exp(zdp1/xsi2));
514    if(gdsr[k]<= 1.e-10) break;
515  }
516  int      indic = 0;
517  for(int k=0;k<NZ;k++) {
518    if( gdsr[k]<=1.e-15 && indic == 0){
519      gdsr[k] = 0.e0;
520      nksr = k+1;
521      indic = 1;
522    }
523    if(nksr>NZ-1) nksr=NZ-1;
524  }
525}                                                         
526
527//_____________________________________________________________________________
528void    cal_ff() //domhgr.F90     Coriolis parameter
529{
530  if(jphgr_msh==5){// beta-plane and rotated domain (gyre configuration)
531    double zbeta = 2.*omega*cos(rad*ppgphi0)/ra ;// beta at latitude ppgphi0
532    double zphi0 = 15.;//latitude of the first row F-points
533    double zf0   = 2.*omega*sin(rad*zphi0);// compute f0 1st point south
534    for(int i=0;i<NX;i++)
535      for(int j=0;j<NY;j++)
536        ff(i,j) = (zf0+zbeta*fabs(gphif(i,j)-zphi0)*rad*ra);// f = f0 +beta* y ( y=0 at south)
537  }
538}
539//_____________________________________________________________________________
540/*void load_shape_func (int argc, char *argv[])  // load PCA axes from file
541{
542  FILE *ffp;
543  if ((ffp=fopen( argv[2], "r")) == NULL){
544    printf( "error: could not find file of shape functions '%s'\n", argv[2]);
545    exit(99);// abort program
546  }
547  if (!strcmp(argv[1],"ta_c")){
548    for(int i=0;i<NX;i++)
549      for(int j=0;j<NY;j++)
550        for(int k=0;k<NZ;k++){
551          for(int n=0;n<NPCA;n++) shfs_ta( i, j, k ,n )=0.0;
552        }
553   
554    int ctrl=-1;
555    while (ctrl<NZ*NY*NX-1){//!feof(ffp)) {
556      ctrl=ctrl+1;
557      for(int n=0;n<NPCA;n++) fscanf(ffp,"%lf",&shfs_ta[ctrl][n]);
558    }
559  }
560  else{
561    printf( "load_shape_func:: pas encore fait\n");
562    exit(99);// abort program
563  }
564 
565  fclose(ffp);
566 
567 
568  ////////////////
569  }*/
570
571//______________________________________________________________________________
572 /*void load_stdev_pca (int argc, char *argv[])  // load stdev from file
573{
574  FILE *ffp;
575  if ((ffp=fopen( argv[2], "r")) == NULL){
576    printf( "error: could not find file of stdev '%s'\n", argv[1]);
577    exit(99);// abort program
578  }
579  if (!strcmp(argv[1],"ta_c")){
580    for(int n=0;n<NPCA;n++) fscanf(ffp,"%lf",&stdev_ta[n]);
581  }
582  else{
583    printf( "load_shape_func:: pas encore fait\n");
584    exit(99);// abort program
585  }
586  fclose(ffp);
587 
588 
589  ////////////////
590  }*/
591//______________________________________________________________________________
592  /*void load_mean (int argc, char *argv[]){  // load mean to generate obs
593  if (!strcmp(argv[2],"ta_c")){
594    if(atoi(argv[1])==0){
595      for(int i=0;i<NX;i++)
596        for(int j=0;j<NY;j++)
597          for(int k=0;k<NZ;k++){
598            moy_ta( i, j, k )=0.0;
599          }
600      for(int i=0;i<NX;i++)
601        for(int j=0;j<NY;j++)
602          for(int k=0;k<NZ;k++){
603            moy_ta( i, j, k )=YS_ta_c(0,i,j,k);
604          }
605    }
606    else if(atoi(argv[1])==1){
607      FILE *ffp;
608      if ((ffp=fopen( argv[3], "r")) == NULL){
609        printf( "error: could not find file of shape functions '%s'\n", argv[3]);
610        exit(99);// abort program
611      }
612      for(int i=0;i<NX;i++)
613        for(int j=0;j<NY;j++)
614          for(int k=0;k<NZ;k++){
615            moy_ta( i, j, k )=0.0;
616          }
617   
618      int ctrl=-1;
619      while (ctrl<NZ*NY*NX-1){//!feof(ffp)) {
620        ctrl=ctrl+1;
621        fscanf(ffp,"%lf",&moy_ta[ctrl]);
622      }
623    }
624  }
625  else{
626    printf( "load_shape_func:: pas encore fait\n");
627    exit(99);// abort program
628  }
629  }*/
630//______________________________________________________________________________
631
632//----------------------------------------------
633#if defined (YE_ta_c) || defined (YE_pca_ta)
634#define true_tac( i, j, k )   (true_tac[(k)*(NY*NX)+(j)*(NX)+(i)])
635double true_tac[NZ*NY*NX];
636#endif
637
638#ifdef YE_sa_c
639#define true_sac( i, j, k )   (true_sac[(k)*(NY*NX)+(j)*(NX)+(i)])
640double true_sac[NZ*NY*NX];
641#endif
642
643#ifdef YE_ua_c
644#define true_uac( i, j, k )   (true_uac[(k)*(NY*NX)+(j)*(NX)+(i)])
645double true_uac[NZ*NY*NX];
646#endif
647
648#ifdef YE_va_c
649#define true_vac( i, j, k )   (true_vac[(k)*(NY*NX)+(j)*(NX)+(i)])
650double true_vac[NZ*NY*NX];
651#endif
652//----------------------------------------------
653void true_target_in_tab(int argc, char *argv[]){
654  int i,j,k;
655  if(!strcmp(argv[1],"ta_c")){
656#if defined (YE_ta_c) || defined (YE_pca_ta)
657    for(i=0;i<NX;i++)
658      for(j=0;j<NY;j++)
659        for(k=0;k<NZ;k++)
660          true_tac( i, j , k ) =YS_ta_c(0,i,j,k);
661#endif
662  } 
663
664  if(!strcmp(argv[1],"sa_c")){
665#ifdef YE_sa_c
666    for(i=0;i<NX;i++)
667      for(j=0;j<NY;j++)
668        for(k=0;k<NZ;k++)
669          true_sac( i, j , k ) =YS_sa_c(0,i,j,k);
670#endif
671  } 
672
673  if(!strcmp(argv[1],"ua_c")){
674#ifdef YE_ua_c
675    for(i=0;i<NX;i++)
676      for(j=0;j<NY;j++)
677        for(k=0;k<NZ;k++)
678          true_uac( i, j , k ) =YS_ua_c(0,i,j,k);
679#endif
680  } 
681
682  if(!strcmp(argv[1],"va_c")){
683#ifdef YE_va_c
684    for(i=0;i<NX;i++)
685      for(j=0;j<NY;j++)
686        for(k=0;k<NZ;k++)
687          true_vac( i, j , k ) =YS_va_c(0,i,j,k);
688#endif
689  } 
690 
691}
692int iii=28,jjj=12;
693//---------------------------
694void normsup_alla_c(){
695  double sum=0.,sumn=0.;
696  int i,j,k;
697 
698#if defined (YE_ta_c) || defined (YE_pca_ta)
699  sum=0.;sumn=0.;
700  for(i=0;i<NX;i++)
701    for(j=0;j<NY;j++)
702      // if(i==iii && j==jjj){
703      for(k=0;k<NZ;k++){
704        if(sum<fabs(true_tac( i, j , k )-YS_ta_c(0,i,j,k))) sum=fabs(true_tac( i, j , k )-YS_ta_c(0,i,j,k));
705        sumn+=(true_tac( i, j , k )-YS_ta_c(0,i,j,k))*(true_tac( i, j , k )-YS_ta_c(0,i,j,k));
706      }//}
707  sumn=sqrt(sumn);
708  printf("norm_sup_diff_ta_c : %23.16e\n",sum);
709  printf("norm_2_diff_ta_c : %23.16e\n",sumn);
710#endif
711 
712#ifdef YE_sa_c
713  sum=0.;sumn=0.;
714  for(i=0;i<NX;i++)
715    for(j=0;j<NY;j++)
716      //if(i==iii && j==jjj){
717      for(k=0;k<NZ;k++){
718        if(sum<fabs(true_sac( i, j , k )-YS_sa_c(0,i,j,k))) sum=fabs(true_sac( i, j , k )-YS_sa_c(0,i,j,k));
719      }//}
720  printf("norm_sup_diff_sa_c : %23.16e\n",sum);
721#endif
722 
723#ifdef YE_ua_c
724  sum=0.;sumn=0.;
725  for(i=0;i<NX;i++)
726    for(j=0;j<NY;j++)
727      for(k=0;k<NZ;k++){
728        if(sum<fabs(true_uac( i, j , k )-YS_ua_c(0,i,j,k))) sum=fabs(true_uac( i, j , k )-YS_ua_c(0,i,j,k));
729      }
730  printf("norm_sup_diff_ua_c : %23.16e\n",sum);
731#endif
732 
733#ifdef YE_va_c
734  sum=0.;sumn=0.;
735  for(i=0;i<NX;i++)
736    for(j=0;j<NY;j++)
737      for(k=0;k<NZ;k++){
738        if(sum<fabs(true_vac( i, j , k )-YS_va_c(0,i,j,k))) sum=fabs(true_vac( i, j , k )-YS_va_c(0,i,j,k));
739      }
740  printf("norm_sup_diff_va_c : %23.16e\n",sum);
741#endif
742 
743}
744
745//__________________________________________________________________
746void xcomparYF();
747void xcomparYF(){
748  //comparer Fortran vs Yao
749  int i,j,k,t,ks=1,ite=0;
750  double v,sum;
751  FILE *pf;
752  char* fua="data_in/comparF_in/traadv_cen2/GYRE_sortie_mohamed_pua.dat";
753  if((pf=fopen(fua,"r"))==NULL){
754    printf("file in function xcomparYF\n");
755    exit(99);
756  }
757  sum=0.;
758  while(!feof(pf)){
759    fscanf(pf," %i %i %i %i %lf",&t,&i,&j,&k,&v);
760    if(t==TA-3 && k==ks){
761      if(sum<fabs(v-YS_ua(0,i-1,j-1,k-1,TA-1))) sum=fabs(v-YS_ua(0,i-1,j-1,k-1,TA-1));
762      ite=1;
763    }
764  }
765  if(ite==0)
766    printf("xcomparYF: problem dans ua\n");
767  else
768    printf("norm_sup(uaF-uaY)(t=%i,k=%i) : %23.16e\n",TA,ks,sum);
769  fclose(pf);
770 
771  char* fva="data_in/comparF_in/traadv_cen2/GYRE_sortie_mohamed_pva.dat";
772  if((pf=fopen(fva,"r"))==NULL){
773    printf("file in function xcomparYF\n");
774    exit(99);
775  }
776 
777  ite=0;
778  sum=0.;
779  while(feof(pf)==0){
780    fscanf(pf," %i %i %i %i %lf",&t,&i,&j,&k,&v);
781    if(t==TA-3 && k==ks){
782      if(sum<fabs(v-YS_va(0,i-1,j-1,k-1,TA-1))) sum=fabs(v-YS_va(0,i-1,j-1,k-1,TA-1));
783      ite=1;
784    }
785  }
786  if(ite==0)
787    printf("xcomparYF: problem dans va\n");
788  else
789    printf("norm_sup(vaF-vaY)(t=%i,k=%i) : %23.16e\n",TA,ks,sum);
790  fclose(pf);
791 
792  char* fwa="data_in/comparF_in/traadv_cen2/GYRE_sortie_mohamed_pwn.dat";
793  if((pf=fopen(fwa,"r"))==NULL){
794    printf("file in function xcomparYF\n");
795    exit(99);
796  }
797 
798  ite=0;
799  sum=0.;
800  while(!feof(pf)){
801    fscanf(pf," %i %i %i %i %lf",&t,&i,&j,&k,&v);
802    if(t==TA-3 && k==ks){
803      if(sum<fabs(v-YS_wa(0,i-1,j-1,k-1,TA-1))) sum=fabs(v-YS_wa(0,i-1,j-1,k-1,TA-1));
804      ite=1;
805    }
806  }
807  if(ite==0)
808    printf("xcomparYF: problem dans wa\n");
809  else
810    printf("norm_sup(waF-waY)(t=%i,k=%i) : %23.16e\n",TA,ks,sum);
811  fclose(pf);
812 
813  char* fta="data_in/comparF_in/traadv_cen2/GYRE_sortie_mohamed_pta.dat";
814  if((pf=fopen(fta,"r"))==NULL){
815    printf("file in function xcomparYF\n");
816    exit(99);
817  }
818 
819  ite=0;
820  sum=0.;
821  while(!feof(pf)){
822    fscanf(pf," %i %i %i %i %lf",&t,&i,&j,&k,&v);
823    if(t==TA-3 && k==ks){
824      if(sum<fabs(v-YS_ta(0,i-1,j-1,k-1,TA-1))) sum=fabs(v-YS_ta(0,i-1,j-1,k-1,TA-1));
825      ite=1;
826    }
827  }
828  if(ite==0)
829    printf("xcomparYF: problem dans ta\n");
830  else
831    printf("norm_sup(taF-taY)(t=%i,k=%i) : %23.16e\n",TA,ks,sum);
832  fclose(pf);
833 
834  char* fsa="data_in/comparF_in/traadv_cen2/GYRE_sortie_mohamed_psa.dat";
835  if((pf=fopen(fsa,"r"))==NULL){
836    printf("file in function xcomparYF\n");
837    exit(99);
838  }
839 
840  ite=0;
841  sum=0.;
842  while(!feof(pf)){
843    fscanf(pf," %i %i %i %i %lf",&t,&i,&j,&k,&v);
844    if(t==TA-3 && k==ks){
845      if(sum<fabs(v-YS_sa(0,i-1,j-1,k-1,TA-1))) sum=fabs(v-YS_sa(0,i-1,j-1,k-1,TA-1));
846      ite=1;
847    }
848  }
849  if(ite==0)
850    printf("xcomparYF: problem dans sa\n");
851  else
852    printf("norm_sup(saF-saY)(t=%i,k=%i) : %23.16e\n",TA,ks,sum);
853  fclose(pf);
854
855
856  char* fsshn="data_in/comparF_in/traadv_cen2/GYRE_sortie_mohamed_psshn.dat";
857  if((pf=fopen(fsshn,"r"))==NULL){
858    printf("file in function xcomparYF\n");
859    exit(99);
860  }
861 
862  ite=0;
863  sum=0.;
864  while(!feof(pf)){
865    fscanf(pf," %i %i %i %lf",&t,&i,&j,&v);
866    if(t==TA-3){
867      if(sum<fabs(v-YS_sshn(0,i-1,j-1,TA-1))) sum=fabs(v-YS_sshn(0,i-1,j-1,TA-1));
868      ite=1;
869    }
870  }
871  if(ite==0)
872    printf("xcomparYF: problem dans sshn\n");
873  else
874    printf("norm_sup(sshnF-sshnY)(t=%i) : %23.16e\n",TA,sum);
875  fclose(pf);
876 
877}
878
879//Gestion des fichiers netcdf
880
881void xrst_save(int argc, char *argv[]) {
882  //Sauvegarde un restart
883  if (argc!=2)
884    {
885      printf("\ncf file for saving restart not specified in command xrst_save\n");
886      exit(1);
887    }
888  else
889    {
890      char rest_file[200];
891      int rest_file_id;
892      int dimid[4];
893      strcpy(rest_file,argv[1]);
894      rest_file_id=Ouvre_nc_write(rest_file); //Ouvre le fichier netcds pour l'écriture
895      write_rst_global_att(rest_file_id); //Ecrit les global attributes
896      define_dim(rest_file_id,dimid); //Définit les dimensions
897      write_rst_var(TU,rest_file_id,dimid); //Ecrit les variables
898      nc_close( rest_file_id); //ferme le fichier
899    }
900}
901
902void xwriteout (int argc, char *argv[]) {
903  //xwriteout t suff ncfile
904  //Ecrit dans le fichier ncfile les variables u,v,t,s,ssh avec le suffixe suff au pas de temps t
905  if (argc!=4)
906   { 
907     printf("\n not enough arguments in writeout\n");
908     exit(1);
909   }
910
911  int t;
912  char suff[200];
913  char ncfile[200];
914  int ncfile_id;
915  t=atoi(argv[1]);
916  strcpy(suff,argv[2]);
917  strcpy(ncfile,argv[3]);
918  ncfile_id=Ouvre_nc_add(ncfile);
919  write_out_var(t,ncfile_id,suff);
920  nc_close(ncfile_id);
921
922}
923void xwritegrad (int argc, char *argv[]) {
924  //xwritegrad t suff ncfile
925  //Ecrit dans le fichier ncfile les grad des variables u,v,t,s,ssh avec le suffixe suff au pas de temps t
926  if (argc!=4)
927   { 
928     printf("\n not enough arguments in writeout\n");
929     exit(1);
930   }
931
932  int t;
933  char suff[200];
934  char ncfile[200];
935  int ncfile_id;
936  t=atoi(argv[1]);
937  strcpy(suff,argv[2]);
938  strcpy(ncfile,argv[3]);
939  ncfile_id=Ouvre_nc_add(ncfile);
940  write_grad_var(t,ncfile_id,suff);
941  nc_close(ncfile_id);
942
943}
944
945void xinitnc(int argc,char *argv[]) {
946  //xinit ncfile
947  //init le fichier netcdf pour sauvegarde
948  if (argc!=2)
949   { 
950     printf("\ncf file for saving output not specified in command xinitnc\n");
951     exit(1);
952   }
953  else
954    {
955      char ncfile[200];
956      int nc_file_id;
957      int dimid[4];
958      strcpy(ncfile,argv[1]);
959      nc_file_id=Ouvre_nc_write(ncfile);
960      define_dim(nc_file_id,dimid);
961      write_out_var_init(nc_file_id,dimid);
962      nc_close(nc_file_id);
963    }
964 
965}
966
967void init_euler(int argc, char *argv[]){
968  if (argc!=2)
969    {
970      printf("\nwrong number of argument in init_euler : specify 0 or 1\n");
971      exit(1);
972    }
973  else
974    {
975      int n;
976      n=atoi(argv[1]);
977      if(n!=0 && n!=1)
978        {
979          printf("\nwrong argument in init_euler : specify 0 or 1 in command init_euler\n");
980          exit(1);
981        }
982      neuler=n;
983    }
984}
Note: See TracBrowser for help on using the repository browser.