source: LMDZ4/branches/V3_test/makegcm @ 704

Last change on this file since 704 was 704, checked in by Laurent Fairhead, 18 years ago

Inclusion des modifs de Y. Meurdesoif pour la version V3
LF

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 18.7 KB
Line 
1#!/bin/csh
2#
3# $Header$
4#
5#set verbose echo
6
7########################################################################
8# path a changer contenant les sources et les objets du modele
9########################################################################
10
11###### VERSION LMDZ.4
12
13set LMDGCM=$WORKDIR/LMDZ4_V3_LAURENT
14set NCDFLIB=/usr/local/SX6/soft/netcdf/lib
15set NCDFINC=/usr/local/SX6/soft/netcdf/include
16set IOIPSLDIR=$WORKDIR/IOIPSL_MPP/src
17set ORCH_LIBDIR=$WORKDIR/LSCE/ORCHIDEE_PARA/libbis
18#1set IOIPSLDIR=$SCRATCHDIR/MODIPSL_NEW/modipsl/lib
19
20setenv localdir "`pwd`"
21
22  if ( ! $?LMDGCM ) then
23    echo You must initialize the variable LMDGCM in your environnement
24    echo for instance: "setenv LMDGCM /usr/myself/supergcm" in .cshrc
25    exit
26  endif
27
28  if ( ! $?LIBOGCM ) then
29    set LIBOGCM=$LMDGCM/libo
30  endif
31
32  if ( ! $?IOIPSLDIR ) then
33    echo You must initialize the variable IOIPSLDIR in your environnement
34    echo for instance: "setenv IOIPSLDIR /usr/myself/ioipsl" in .cshrc
35    exit
36  endif
37
38  if ( ! $?NCDFLIB ) then
39    echo You must initialize the variable NCDFLIB in your environnement
40    echo for instance: "setenv NCDFLIB /usr/myself/netcdf" in .cshrc
41    exit
42  endif
43
44  if ( ! $?NCDFINC ) then
45    echo You must initialize the variable NCDFINC in your environnement
46    echo for instance: "setenv NCDFINC /usr/myself/netcdf" in .cshrc
47    exit
48  endif
49endif
50
51set model=$LMDGCM
52set libf=$model/libf
53set libo=$LIBOGCM
54if ( ! -d $libo )  then
55   mkdir $libo
56endif
57
58########################################################################
59#  Quelques initialisations de variables du shell.
60########################################################################
61
62set dyn=
63set opt_link=""
64set adjnt=""
65set opt_dep=""
66
67set optim=""
68set optimbis=""
69set optim90=""
70set oplink=""
71
72
73########################################################################
74# options du compilateur
75########################################################################
76
77  set machine=SX6
78  set f77=sxf90.new
79  set f90=sxf90.new
80  set optim90='-C vsafe -gv -P stack -Wf,-pvctl res=whole,-A dbl4,-init stack=nan,-init heap=nan,-ptr byte -EP -ts ${GCM}/tmp_src -R5 -float0 -size_t64 -dw -Wf,"-pvctl loopcnt=999999 fullmsg noassume" -I/SX/usr/include'
81  set optimtru90="$optim90"
82  set optim="$optim90"
83  set cppflags='-DNC_DOUBLE -DBLAS -DSGEMV=DGEMV -DSGEMM=DGEMM'
84  set opt_link='-float0 -size_t64 -Wf,-A dbl4 -lblas'
85  set mod_suffix="mod"
86  set mod_loc_dir="./"
87  set make="sxmake -i RANLIB=ls"
88  set link="$f90 -Wl,-hlib_cyclic"   
89  set ar=sxar
90  set optim90="$optim90 -f3"
91 
92########################################################################
93# options par defaut pour la commande make
94########################################################################
95
96  set dim="96x72x19"
97  set physique=lmd
98  set phys="PHYS=$physique" 
99  set include='-I$(LIBF)/filtrez -I$(LIBF)/grid -I$(LIBF)/bibio -I. '
100  set ntrac = 4
101  set filtre=filtrez
102  set grille=reg
103  set couple=false
104  set veget=false
105  set psmile=false
106  set io=ioipsl
107  set inca=false
108  set vampir=false
109  set parallel=false
110 
111  if ($parallel == true) then
112    set cppflags = " $cppflags -DCPP_PARA"
113    set include="$include"' -I$(LIBF)/dyn3d_par'
114  else
115    set include="$include"' -I$(LIBF)/dyn3d'
116  endif
117   
118  if ($inca == true) then
119    set cppflags="$cppflags -DINCA -DINCA_CH4"
120    set opt_link="$opt_link -linca"
121  endif
122
123  if ($couple == true) then
124     set opt_link="$opt_link -L/scratchdir/p86yann/MODIPSL_NEW/modipsl/prism/SX/lib -lpsmile.MPI2 -lmpp_io"
125     set cppflags="$cppflags -DCPP_COUPLE -DCPP_PSMILE -I/scratchdir/p86yann/MODIPSL_NEW/modipsl/prism/SX/build/lib/psmile.MPI2"
126  endif
127
128  if ($veget == true) then
129     set opt_link="$opt_link -L $ORCH_LIBDIR -lsxparameters -lsxsechiba -lsxstomate -lsxparallel"
130     set cppflags="$cppflags -DCPP_VEGET"
131     set include="$include"" -I$ORCH_LIBDIR"
132  endif
133 
134  if ($vampir == true) then
135    set cppflags="$cppflags -vt -DUSE_VT"
136    set opt_link="$opt_link -vt"
137  else
138    set cppflags="$cppflags -DNUSE_VT"
139    set opt_link="$opt_link"
140  endif
141 
142  set optim90=" $optim90  -I$libo $cppflags"
143  set optimtru90=" $optimtru90 -I$libo $cppflags"
144  set optim=" $optim  -I$libo $cppflags"
145  set opt_link="$opt_link -L$IOIPSLDIR -lsxioipsl -L$NCDFLIB -lnetcdf"
146 
147########################################################################
148#  Les differentes platformes reconnues
149########################################################################
150set X6NEC=1
151
152
153########################################################################
154# lecture des options de mymake
155########################################################################
156
157top:
158if ($#argv > 0) then
159    switch ($1:q)
160
161    case -h:
162
163########################################################################
164# Manuel en ligne
165########################################################################
166more <<eod
167
168
169makegcm [Options] prog
170
171
172
173
174Par default, la commande makegcm:
175---------------------------------
176
1771. compile une serie de sous programmes se trouvant dans des sous-repertoires
178de $LMDGCM/libf.
179Les sous programmes sont ensuite stokes sur dans des librairies FORTRAN
180sur $LIBOGCM.
181
1822. Ensuite, makegcm compile le programme prog.f se trouvant par default sur
183$LMDGCM/libf/dyn3d et effectue le lien avec l ensemble des librairies.
184
185La variable '$LMDGCM' doit etre initialisee dans votre .cshrc ou en dur
186dans la comande makegcm.
187
188La commande makegcm est faite pour permettre de gerer en parallele des
189versions differentes du modele, compilees avec des options de compilation
190et des dimensions differentes sans avoir a chaque fois a recompiler tout
191le modele.
192
193Les librairies FORTRAN sont stoquees sur le directory $LIBOGCM.
194
195
196OPTIONS:
197--------
198
199Les options suivantes peuvent etre definies soit par defaut en editant le
200"script" makegcm, soit en interactif:
201
202-d imxjmxlm  ou im, jm, et lm sont resp. le nombre de longitudes, latitudes
203             et couches verticales.
204
205-t ntrac   selectionne le nombre de traceur advectes par la dynamique.
206           Dans les versions courantes du modele terrestre on a par exemple
207           ntrac=2 pour l'eau vapeur et liquide
208
209             L'effet des options -d et -t est d'ecraser le fichier
210             $LMDGCM/libf/grid/dimensions.h
211             qui contient sous forme de 4 PARAMETER FORTRAN les 3 dimensions
212             de la grille horizontale im, jm, lm plus le nombre de traceurs
213             advectes passivement par la dynamique ntrac, par un nouveu fichier
214             $LMDGCM/libf/grid/dimension/dimensions.im.jm.lm.tntrac
215             Si ce fichier n'existe pas encore, il est cree par le script
216             $LMDGCM/libf/grid/dimension/makdim
217
218-p PHYS    pour selectionner le jeu de parametrisations physiques avec
219           lequel on veut compiler le modele.
220           Le modele sera alors compile en prenant les sources des
221           parametrisations physiques dans le repertoire:
222            $LMDGCM/libf/phyPHYS
223
224-c false|true
225           pour selectionner le mode force (par defaut) ou couple
226
227-io ioipsl|noioipsl
228           pour selectionner le logiciel IO : IOIPSL par defaut
229
230-psmile false|true
231           pour selectionner le mode psmile ou non (par defaut)
232
233-v true|false
234           pour selectionner la vegetation (par defaut) ou non
235
236-g grille  selectionne le type de grille qu'on veut utiliser.
237           L'effet de cette option est d'ecraser le fichier
238           $LMDGCM/libf/grid/fxyprim.h
239           avec le fichier
240           $LMDGCM/libf/grid/fxy_grille.h
241           grille peut prendre les valeurs:
242           1. reg pour la grille reguliere
243           2. sin pour avoir des points equidistants en sinus de la latitude
244           3. new pour pouvoir zoomer sur une partie du globe
245
246-O "optimisation fortran" ou les optimisations fortran sont les options de la
247            commande f77
248
249-include path
250           Dans le cas ou on a dans des sous programmes des fichiers
251           #include (cpp) qui se trouve sur des repertoires non references
252           par defaut
253
254-adjnt     Pour compiler la l'adjoint du code dynamique
255
256-filtre  filtre
257           Pour choisir le filtre en longitude dans les regions polaires.
258           "filtre" correspond au nom d'un repertoire se trouvant sur
259           $LMDGCM/libf. Le filtre standard du modele est "filtrez" qui peut
260           etre utilise aussi bien pour une grille reguliere que pour une
261           grille zoomee en longitude.
262
263-link "-Ldir1 -lfile1 -Ldir2 -lfile2 ..."
264          Pour rajouter un lien avec les librairies FORTRAN
265          libfile1.a, libfile2.a ... se trouvant respectivement sur les
266          repertoires dir1, dir2 ...
267          Si dirn est un repertoire dont le chemin est automatique (comme
268          par exemple /usr/lib ...) il n'est pas besoin de specifier -Ldirn.
269
270Auteur: Frederic Hourdin  (hourdin@lmd.jussieu.fr)
271eod
272exit
273
274########################################################################
275# Lecture des differentes options
276########################################################################
277
278    case -d:
279        set dim=$2 ; shift ; shift ; goto top
280                       
281    case -O:
282        set optim="$2" ; shift ; shift ; goto top
283
284     case -p
285        set physique="$2" ; set phys="PHYS=$physique" ; shift ; shift ; goto top
286
287     case -g
288        set grille="$2" ; shift ; shift ; goto top
289
290     case -c
291        set couple="$2" ; shift ; shift ; goto top
292
293     case -io
294        set io="$2" ; shift ; shift ; goto top
295
296     case -v
297        set veget="$2" ; shift ; shift ; goto top
298
299     case -psmile
300        set psmile="$2" ; shift ; shift ; goto top
301 
302     case -t
303        set ntrac=$2 ; shift ; shift ; goto top
304
305     case -include
306        set include="$include -I$2" ; shift ; shift ; goto top
307
308     case -adjnt
309        set opt_dep="$opt_dep adjnt" ; set adjnt="-ladjnt -ldyn3d "
310        set optim="$optim -Dadj" ; shift ; goto top
311
312     case -filtre
313        set filtre=$2 ; shift ; shift ; goto top
314
315     case -link
316        set opt_link="$opt_link $2" ; shift ; shift ; goto top
317
318     case -debug
319        if $X6NEC then
320        else
321           echo pas d option debug predefinie pour cette machine
322           exit
323        endif
324        shift ; goto top
325
326     default
327        set code="$1" ; shift ; goto top
328
329   endsw
330endif
331
332########################################################################
333# Definition des clefs CPP
334########################################################################
335
336if ( $io == ioipsl ) then
337   set optim="$optim -DCPP_IOIPSL"
338   set optim90="$optim90 -DCPP_IOIPSL"
339   set optimtru90="$optimtru90 -DCPP_IOIPSL"
340endif
341
342if ( "$physique" == 'nophys' ) then
343   set phys="L_PHY= LIBPHY="
344else
345   set optim="$optim -DCPP_PHYS"
346   set optim90="$optim90 -DCPP_PHYS"
347   set optimtru90="$optimtru90 -DCPP_PHYS"
348endif
349
350#set link_veget=" "
351#if ( "$veget" == 'true' ) then
352#   set optim="$optim -DCPP_VEGET"
353#   set optim90="$optim90 -DCPP_VEGET"
354#   set optimtru90="$optimtru90 -DCPP_VEGET"
355#   set link_veget=" -lsechiba -lparameters -lstomate"
356#endif
357
358if ($parallel == 'true') then
359  set FLAG_PARA='_par'
360else
361  set FLAG_PARA=''
362endif
363
364########################################################################
365# cas special sans physique
366########################################################################
367if ( "$physique" == 'nophys' ) then
368   set phys="L_PHY= LIBPHY="
369endif
370
371########################################################################
372# choix du nombre de traceur par defaut si il n'a pas ete choisi,
373# suivant la physique
374########################################################################
375
376if ( $ntrac == 0  ) then
377    if ( "$physique" == 'nophys' ) then
378        set ntrac=1
379    else if ( "$physique" == 'lmd' ) then
380        set ntrac=2
381    else if ( "$physique" == 'lmd_test_li' ) then
382        set ntrac=2
383    else if ( "$physique" == 'ec' ) then
384        set ntrac=1
385    else
386        set ntrac = 1
387    endif
388endif
389
390########################################################################
391#subtilites sur le nom de la librairie
392########################################################################
393
394\rm -f tmp ; touch tmp
395\rm -f tmp90 ; touch tmp90
396foreach i ( $optim )
397   echo $i | sed -e 's/\"//g' -e "s/\'//g" -e 's/-//g'  >> tmp
398end
399set suf=
400foreach i ( `sort tmp | uniq ` )
401   set suf=$suf$i
402end
403
404   set dim=`echo $dim | sed -n -e 's/[^0-9]/ /gp'`
405   set dim_=`echo $dim | sed -n -e 's/[^0-9]/_/gp'`
406   set nomlib=`echo ${machine}_${dim_}_t${ntrac}`
407
408echo calcul de la dimension
409set dimc=`echo $dim | wc -w`
410
411if ( "$dimc" == "2" ) then
412set include="$include "'-I$(LIBF)/dyn2d '
413set dimh=$dim
414else
415set include="$include "
416set dimh=`echo $dim | awk ' { print $1 "." $2 } '`
417endif
418echo $dimc
419
420########################################################################
421# path pour les #include
422########################################################################
423
424  set include="$include -I$NCDFINC -I$IOIPSLDIR"
425  echo $include
426
427########################################################################
428# Gestion des dimensions du modele.
429# on cree ou remplace le fichier des dimensions/nombre de traceur
430########################################################################
431
432cd $libf/grid
433if ( -f dimensions.h ) then
434echo 'ATTENTION: vous etes sans doute en train de compiler le modele par ailleurs'
435echo "Attendez que la premiere compilation soit terminee pour relancer la suivante."
436echo "Si vous etes sur que vous ne compilez pas le modele par ailleurs,"
437echo  vous pouvez continuer en repondant oui.
438echo "Voulez-vous vraiment continuer?"
439if ( $< == "oui" ) then
440\rm -f $libf/grid/dimensions.h
441else
442exit
443endif
444endif
445
446cd dimension
447makdim $ntrac $dim
448cat $libf/grid/dimensions.h
449
450cd $LMDGCM
451set libo=$libo/$nomlib
452if ( ! -d $libo )  then
453   mkdir $libo
454   cd $model
455endif
456
457########################################################################
458# Differentes dynamiques (3d, 2d, 1d)
459########################################################################
460
461set dimension=`echo $dim | wc -w`
462echo dimension $dimension
463if ( $dimension == 1 ) then
464echo pas de dynamique
465set dyn="L_DYN= DYN= L_FILTRE= DIRMAIN=phy$physique "
466endif
467endif
468cd $model
469if ( $dimension == 3 ) then
470cd libf/grid
471\rm fxyprim.h
472cp -p fxy_${grille}.h fxyprim.h
473endif
474
475######################################################################
476#   Traitement special pour le nouveau rayonnement de Laurent Li.
477######################################################################
478
479if ( -f $libf/phy$physique/raddim.h ) then
480 if ( -f $libf/phy$physique/raddim.$dimh.h ) then
481  \rm -f $libf/phy$physique/raddim.h
482  cp -p $libf/phy$physique/raddim.$dimh.h $libf/phy$physique/raddim.h
483  echo $libf/phy$physique/raddim.$dimh.h
484  cat $libf/phy$physique/raddim.$dimh.h
485  cat $libf/phy$physique/raddim.h
486 else
487  echo On peut diminuer la taille de l executable en creant
488  echo le fichier $libf/phy$physique/raddim.$dimh.h
489  \cp -p $libf/phy$physique/raddim.defaut.h $libf/phy$physique/raddim.h
490 endif
491endif
492
493######################################################################
494# Gestion du filtre qui n'existe qu'en 3d.
495######################################################################
496
497if ( `expr $dimc \> 2` == 1 ) then
498   set filtre="FILTRE=$filtre"
499else
500   set filtre="FILTRE= L_FILTRE= "
501endif
502echo MACRO FILTRE $filtre
503
504echo $dimc
505
506########################################################################
507#  utilisation des vraies routines de couplage si on est en couple
508########################################################################
509if ( $couple == 'true' ) then
510  pwd
511#  if ( `diff $libf/phy$physique/oasis.F $libf/phy$physique/oasis.true | wc -w` ) then
512#   \cp $libf/phy$physique/oasis.F $libf/phy$physique/oasis.dummy
513#   \cp $libf/phy$physique/oasis.true $libf/phy$physique/oasis.F
514#  endif
515   if ( -f $libf/phy$physique/oasis.F ) then
516     rm -f $libf/phy$physique/oasis.F
517   endif       
518   \cp $libf/phy$physique/oasis.psmile $libf/phy$physique/oasis.F90
519else
520  if ( `diff $libf/phy$physique/oasis.F $libf/phy$physique/oasis.dummy | wc -w` ) then
521   \cp $libf/phy$physique/oasis.F $libf/phy$physique/oasis.true
522   \cp $libf/phy$physique/oasis.dummy $libf/phy$physique/oasis.F
523  endif
524   rm -f $libf/phy$physique/oasis.F90
525endif
526########################################################################
527#  Avant de lancer le make, on recree le makefile si necessaire
528########################################################################
529# c'est a dire dans 3 cas:
530# 1. si la liste des fichiers .F et .h a ete modifiee depuis la
531#    derniere creation du makefile
532# 2. si le fichier contenant cette liste "liste_des_sources"
533#    n'existe pas.
534# 3. Si le makefile n'existe pas.
535########################################################################
536
537cd $model
538find libf -name '*.[Fh]' -print >! tmp77
539find libf -name '*.[Fh]' -exec egrep -i " *use *ioipsl" {} \; -print >! tmp90
540find libf -name '*.[Fh]90' -print >> tmp90
541
542if (    `diff tmp77 liste_des_sources_f77 | wc -w` \
543     || `diff tmp90 liste_des_sources_f90 | wc -w` \
544     || ! -f makefile \
545     || ! -f liste_des_sources_f90 \
546     || ! -f liste_des_sources_f77 ) then
547        echo les fichiers suivants ont ete crees ou detruits
548        echo ou les fichiers suivants sont passes ou ne sont plus en Fortran 90
549        diff liste_des_sources_f77 tmp77
550        diff liste_des_sources_f90 tmp90
551        \cp tmp77 liste_des_sources_f77
552        \cp tmp90 liste_des_sources_f90
553        echo On recree le makefile
554        ./create_make_gcm >! tmp
555        \mv tmp makefile
556        echo Nouveau makefile cree.
557endif
558
559########################################################################
560#  Execution de la comande make
561########################################################################
562
563echo PHYSIQUE $phys
564echo dynamique $dyn $dimension
565echo OPTIM="$optim" $filtre LIBO=$libo $dyn PHYS=$phys DIM=$dimc PROG=$code
566echo PATH pour les fichiers INCLUDE $include
567echo OPLINK="$oplink"
568
569
570set include="$include"' -I$(LIBF)/phy'"$physique"
571set include="$include"' -I$(LIBO)'
572
573
574#################################################################
575# Execution de la comande make... ENFIN!
576#################################################################
577
578
579
580cd $localdir
581
582echo $make -f $LMDGCM/makefile \
583OPTION_DEP="$opt_dep" OPTION_LINK="$opt_link" \
584OPTIM90="$optim90" \
585OPTIMTRU90="$optimtru90" \
586OPTIM="$optim$optimbis" \
587INCLUDE="$include" \
588$filtre \
589LIBO=$libo \
590$dyn \
591$phys \
592DIM=$dimc \
593FLAG_PARA="$FLAG_PARA"\
594L_ADJNT="$adjnt" \
595LOCAL_DIR="$localdir"  \
596F77="$f77" \
597F90="$f90" \
598OPLINK="$oplink" \
599LINK="$link" \
600GCM="$LMDGCM" \
601MOD_LOC_DIR=$mod_loc_dir \
602MOD_SUFFIX=$mod_suffix \
603AR=$ar \
604PROG=$code
605
606
607$make -f $LMDGCM/makefile \
608OPTION_DEP="$opt_dep" OPTION_LINK="$opt_link" \
609OPTIM90="$optim90" \
610OPTIMTRU90="$optimtru90" \
611OPTIM="$optim$optimbis" \
612INCLUDE="$include" \
613$filtre \
614LIBO=$libo \
615$dyn \
616$phys \
617DIM=$dimc \
618FLAG_PARA="$FLAG_PARA"\
619L_ADJNT="$adjnt" \
620LOCAL_DIR="$localdir"  \
621F77="$f77" \
622F90="$f90" \
623OPLINK="$oplink" \
624LINK="$link" \
625GCM="$LMDGCM" \
626MOD_LOC_DIR=$mod_loc_dir \
627MOD_SUFFIX=$mod_suffix \
628AR=$ar \
629PROG=$code
630
631\rm -f $libf/grid/dimensions.h
Note: See TracBrowser for help on using the repository browser.