source: LMDZ.3.3/trunk/makegcm @ 69

Last change on this file since 69 was 69, checked in by lmdz, 24 years ago

Nouvelles options pour compilation sur VPP. P. Braconnot
LF

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 20.1 KB
Line 
1#!/bin/csh
2#set verbose echo
3########################################################################
4# options par defaut pour la commande make
5########################################################################
6set dim="48x32x19"
7set physique=lmd
8set phys="PHYS=$physique"
9set include='-I$(LIBF)/grid -I$(LIBF)/bibio -I. '
10set ntrac = 4
11set filtre=filtrez
12set grille=reg
13########################################################################
14# path a changer contenant les sources et les objets du modele
15########################################################################
16
17###### VERSION LMDZ.3.3
18# set LMDGCM=$HOME/LMDZ.3.3
19#
20#   a changer  rlmd304/agcm
21#
22###### VERSION LMDZ.3.2
23
24if ( ! $?LMDGCM ) then
25   echo You must initialize the variable LMDGCM in your environnement
26   echo for instance: "setenv LMDGCM /usr/myself/supergcm" in .cshrc
27   exit
28endif
29if ( ! $?LIBOGCM ) then
30   set LIBOGCM=$LMDGCM/libo
31endif
32if ( ! $?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
36endif
37if ( ! $?NCDFLIB ) then
38   echo You must initialize the variable NCDFLIB in your environnement
39   echo for instance: "setenv NCDFLIB /usr/myself/netcdf" in .cshrc
40   exit
41endif
42if ( ! $?NCDFINC ) then
43   echo You must initialize the variable NCDFINC in your environnement
44   echo for instance: "setenv NCDFINC /usr/myself/netcdf" in .cshrc
45   exit
46endif
47set model=$LMDGCM
48set libo=$LIBOGCM
49
50########################################################################
51#  Les differentes platformes reconnues
52########################################################################
53
54set HP=0
55set IBM=0
56set SUN=0
57set VPP=0
58set CRAY=0
59set DEC=0
60set LINUX=0
61set NEC=0
62if ( `uname` == HP-UX ) then
63   set machine=HP
64   set HP=1
65else if (`uname` == UNIX_System_V ) then
66   set machine=VPP
67   set VPP=1
68else if (`uname` == SunOS ) then
69   set machine=SUN
70   set SUN=1
71else if ( `uname` == AIX ) then
72   set machine=IBM
73   set IBM=1
74else if ( `uname` == OSF1 ) then
75   set machine=ALPHA
76   set DEC=1
77else if ( `uname` == Linux ) then
78   set machine=LINUX
79   set LINUX=1
80else if ( `hostname` == atlas || `hostname` == axis  || `hostname` == etoile ) then
81   set machine=CRAY
82   set CRAY=1
83else if ( `uname` == SUPER-UX ) then
84   set machine=NEC
85   set NEC=1
86else
87   echo Vous travaillez sur une machine non prevue par le reglement
88   exit
89endif
90
91if ( ! -d $libo )  then
92   mkdir $libo
93endif
94
95
96if $VPP then
97set netcdf=netcdf_v
98else
99set netcdf=netcdf
100endif
101########################################################################
102#  Quelques initialisations de variables du shell.
103########################################################################
104
105set dyn=
106set opt_link=""
107set adjnt=""
108set opt_dep=""
109
110set optim=""
111set optimbis=""
112set optim90=""
113set oplink=""
114
115########################################################################
116#  Optimisations par defaut suivant les machines
117########################################################################
118
119echo "Optimisations par defaut suivant les machines"
120set libf=$model/libf
121#setenv localdir "LOCAL_DIR=`pwd`"
122setenv localdir "`pwd`"
123cd $model
124if $CRAY then
125#   set optim="-Wf'-ei' -dp -Wf'-a static'"
126   set optimbis=" -DCRAY "
127   set optim90="-Wp'-P' -DCRAY -p$IOIPSLDIR "'-p$(LIBO) -eiv '
128   set optim="$optim90"
129   set oplink="-Wl'-DSTACK=128 -f indef' -L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf "
130   set mod_loc_dir=" "
131   set mod_suffix=" "
132else if $SUN then
133   set optim=" -fast "
134   set optimbis=" "
135   set optim90=" -fast -fixed "
136   set opt_link="-lf77compat -L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf"
137   set mod_loc_dir=$localdir
138   set mod_suffix=mod
139else if $HP then
140   set optim=" +U77 -O +E1 "
141   set optimbis=" "
142else if $IBM then
143   set optim=" -O3 -qtune=pwr2 -qarch=pwr2"
144   set optimbis=" "
145else if $VPP then
146#   set optim="-Dasuxm  -On, -g -Ad -Potilax -Eciplume -Si"
147#   set optimbis="  -Wv,-m3 -Wp,-DVPP -Z $LMDGCM/listage"
148   set optimbis=" -Z $LMDGCM/listage"
149   set optim90="$optim $optimbis -w"
150   set opt_link="-Wg,-c -L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf"
151   set oplink=" "
152   set mod_loc_dir=$IOIPSLDIR
153   set mod_suffix=mod
154else if $DEC then
155   set optim=" "
156   set optimbis=" "
157else if $LINUX then
158   set optim="-fast "
159   set optim90=" -fast -module $libo"
160   set opt_link=" -Mfree -L/usr/local/pgi/linux86/lib -lpgf90 -lpgftnrtl -lpghpf -lpghpf2 -L$NCDFLIB -lnetcdf -L$IOIPSLDIR -lioipsl -Wl,-Bstatic "
161   set mod_loc_dir=$IOIPSLDIR
162   set mod_suffix=mod
163else if $NEC then
164   set optim90=' -C hopt -float0 -ew -R4 -L nostdout '
165   set optim90=' -C hopt -float0 -eabw -P static -R5 -pi auto line=500 -Wf,-O,extendreorder,-pvctl,fullmsg,vchg,noverrchk,assume,loopcnt=300000,vwork=stack,-L,summary,transform'
166   set optim="$optim90"
167   set opt_link=" -L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf "
168   set opt_link=" -V -float0 -ew  -P static -Wl,-Z,4800000,-h,lib_cyclic -L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf "
169   set optimbis=" "
170   set mod_loc_dir="."
171   set mod_suffix="mod"
172else
173   set optim=""
174   set optimbis=" "
175endif
176
177set nomlib=$machine
178
179########################################################################
180# lecture des options de mymake
181########################################################################
182
183top:
184if ($#argv > 0) then
185    switch ($1:q)
186
187    case -h:
188
189########################################################################
190# Manuel en ligne
191########################################################################
192more <<eod
193
194
195makegcm [Options] prog
196
197
198
199
200Par default, la commande makegcm:
201---------------------------------
202
2031. compile une serie de sous programmes se trouvant dans des sous-repertoires
204de $LMDGCM/libf.
205Les sous programmes sont ensuite stokes sur dans des librairies FORTRAN
206sur $LIBOGCM.
207
2082. Ensuite, makegcm compile le programme prog.f se trouvant par default sur
209$LMDGCM/libf/dyn3d et effectue le lien avec l ensemble des librairies.
210
211La variable '$LMDGCM' doit etre initialisee dans votre .cshrc ou en dur
212dans la comande makegcm.
213
214La commande makegcm est faite pour permettre de gerer en parallele des
215versions differentes du modele, compilees avec des options de compilation
216et des dimensions differentes sans avoir a chaque fois a recompiler tout
217le modele.
218
219Les librairies FORTRAN sont stoquees sur le directory $LIBOGCM.
220
221
222OPTIONS:
223--------
224
225Les options suivantes peuvent etre definies soit par defaut en editant le
226"script" makegcm, soit en interactif:
227
228-d imxjmxlm  ou im, jm, et lm sont resp. le nombre de longitudes, latitudes
229             et couches verticales.
230
231-t ntrac   selectionne le nombre de traceur advectes par la dynamique.
232           Dans les versions courantes du modele terrestre on a par exemple
233           ntrac=2 pour l'eau vapeur et liquide
234
235             L'effet des options -d et -t est d'ecraser le fichier
236             $LMDGCM/libf/grid/dimensions.h
237             qui contient sous forme de 4 PARAMETER FORTRAN les 3 dimensions
238             de la grille horizontale im, jm, lm plus le nombre de traceurs
239             advectes passivement par la dynamique ntrac, par un nouveu fichier
240             $LMDGCM/libf/grid/dimension/dimensions.im.jm.lm.tntrac
241             Si ce fichier n'existe pas encore, il est cree par le script
242             $LMDGCM/libf/grid/dimension/makdim
243
244-p PHYS    pour selectionner le jeu de parametrisations physiques avec
245           lequel on veut compiler le modele.
246           Le modele sera alors compile en prenant les sources des
247           parametrisations physiques dans le repertoire:
248            $LMDGCM/libf/phyPHYS
249
250-g grille  selectionne le type de grille qu'on veut utiliser.
251           L'effet de cette option est d'ecraser le fichier
252           $LMDGCM/libf/grid/fxyprim.h
253           avec le fichier
254           $LMDGCM/libf/grid/fxy_grille.h
255           grille peut prendre les valeurs:
256           1. reg pour la grille reguliere
257           2. sin pour avoir des points equidistants en sinus de la latitude
258           3. new pour pouvoir zoomer sur une partie du globe
259
260-O "optimisation fortran" ou les optimisations fortran sont les options de la
261            commande f77
262
263-include path
264           Dans le cas ou on a dans des sous programmes des fichiers
265           #include (cpp) qui se trouve sur des repertoires non references
266           par defaut
267
268-adjnt     Pour compiler la l'adjoint du code dynamique
269
270-filtre  filtre
271           Pour choisir le filtre en longitude dans les regions polaires.
272           "filtre" correspond au nom d'un repertoire se trouvant sur
273           $LMDGCM/libf. Le filtre standard du modele est "filtrez" qui peut
274           etre utilise aussi bien pour une grille reguliere que pour une
275           grille zoomee en longitude.
276
277-link "-Ldir1 -lfile1 -Ldir2 -lfile2 ..."
278          Pour rajouter un lien avec les librairies FORTRAN
279          libfile1.a, libfile2.a ... se trouvant respectivement sur les
280          repertoires dir1, dir2 ...
281          Si dirn est un repertoire dont le chemin est automatique (comme
282          par exemple /usr/lib ...) il n'est pas besoin de specifier -Ldirn.
283
284Auteur: Frederic Hourdin  (hourdin@lmd.jussieu.fr)
285eod
286exit
287
288########################################################################
289# Lecture des differentes options
290########################################################################
291
292    case -d:
293        set dim=$2 ; shift ; shift ; goto top
294                       
295    case -O:
296        set optim="$2" ; shift ; shift ; goto top
297
298     case -p
299        set physique="$2" ; set phys="PHYS=$physique" ; shift ; shift ; goto top
300
301     case -g
302        set grille="$2" ; shift ; shift ; goto top
303
304     case -t
305        set ntrac=$2 ; shift ; shift ; goto top
306
307     case -include
308        set include="$include -I$2" ; shift ; shift ; goto top
309
310     case -adjnt
311        set opt_dep="$opt_dep adjnt" ; set adjnt="-ladjnt -ldyn3d "
312        set optim="$optim -Dadj" ; shift ; goto top
313
314     case -filtre
315        set filtre=$2 ; shift ; shift ; goto top
316
317     case -link
318        set opt_link="$2" ; shift ; shift ; goto top
319
320     case -debug
321        if $HP then
322           set optim=" -g "
323        else if $SUN then
324           setenv PARALLEL 2
325           set optim=" -g -C "
326           set optim90=" -fixed -g "
327        else if $CRAY then
328           set optim="$optim"" -g "
329           set optim90="$optim90"" -G1 "
330        else if $LINUX then
331           set optim="$optim"" -g -Mbounds "
332           set optim90="$optim90"" -g -Mbounds "
333        else
334           echo pas d option debug predefinie pour cette machine
335           exit
336        endif
337        shift ; goto top
338
339     default
340        set code="$1" ; shift ; goto top
341
342   endsw
343endif
344
345########################################################################
346# cas special sans physique
347########################################################################
348if ( "$physique" == 'nophys' ) then
349   set phys="L_PHY= LIBPHY="
350endif
351
352########################################################################
353# choix du nombre de traceur par defaut si il n'a pas ete choisi,
354# suivant la physique
355########################################################################
356
357if ( $ntrac == 0  ) then
358    if ( "$physique" == 'nophys' ) then
359        set ntrac=1
360    else if ( "$physique" == 'lmd' ) then
361        set ntrac=2
362    else if ( "$physique" == 'lmd_test_li' ) then
363        set ntrac=2
364    else if ( "$physique" == 'ec' ) then
365        set ntrac=1
366    else
367        set ntrac = 1
368    endif
369endif
370
371########################################################################
372#subtilites sur le nom de la librairie
373########################################################################
374
375\rm tmp ; touch tmp
376\rm tmp90 ; touch tmp90
377foreach i ( $optim )
378   echo $i | sed -e 's/\"//g' -e "s/\'//g" -e 's/-//g'  >> tmp
379end
380set suf=
381foreach i ( `sort tmp | uniq ` )
382   set suf=$suf$i
383end
384if ( ! $IBM ) then
385   set nomlib="$nomlib$suf"
386endif
387if ( $DEC ) then
388   set nomlib=DEC
389endif
390if ( $IBM ) then
391   set dim=`echo $dim | sed -en 's/[^0-9]/ /g'`
392   set dim_=`echo $dim | sed -en 's/[^0-9]/_/g'`
393else if ( $SUN ) then
394   set dim=`echo $dim | sed -e 's/[^0-9]/ /g'` 
395   set dim_=`echo $dim | sed -e 's/[^0-9]/_/g'`
396else
397   set dim=`echo $dim | sed -n -e 's/[^0-9]/ /gp'`
398   set dim_=`echo $dim | sed -n -e 's/[^0-9]/_/gp'`
399endif
400set nomlib=${nomlib}_${dim_}_t${ntrac}_$grille
401## M-A-F nomlib trop long sur CRAY pour ar
402if ( $CRAY ) then
403    set nomlib=F90_${dim_}_t${ntrac}
404endif
405if ( $NEC ) then
406    set nomlib=F90_${dim_}_t${ntrac}
407endif
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 "'-I$(LIBF)/dyn3d '
416set dimh=`echo $dim | awk ' { print $1 "." $2 } '`
417endif
418echo $dimc
419
420########################################################################
421# path pour les #include
422########################################################################
423
424set include="$include -I$NCDFINC -I$IOIPSLDIR"
425echo $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 $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
480if ( -f $libf/phy$physique/raddim.$dimh.h ) then
481\rm $libf/phy$physique/raddim.h
482cp -p $libf/phy$physique/raddim.$dimh.h $libf/phy$physique/raddim.h
483echo $libf/phy$physique/raddim.$dimh.h
484cat $libf/phy$physique/raddim.$dimh.h
485cat $libf/phy$physique/raddim.h
486else
487echo On peut diminuer la taille de l executable en creant
488echo le fichier $libf/phy$physique/raddim.$dimh.h
489\cp -p $libf/phy$physique/raddim.defaut.h $libf/phy$physique/raddim.h
490endif
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#  Avant de lancer le make, on recree le makefile si necessaire
508########################################################################
509# c'est a dire dans 3 cas:
510# 1. si la liste des fichiers .F et .h a ete modifiee depuis la
511#    derniere creation du makefile
512# 2. si le fichier contenant cette liste "liste_des_sources"
513#    n'existe pas.
514# 3. Si le makefile n'existe pas.
515########################################################################
516
517cd $model
518find libf -name '*.[Fh]' -print >! tmp77
519find libf -name '*.[Fh]' -exec egrep -i " *use *ioipsl" {} \; -print >! tmp90
520
521if (    `diff tmp77 liste_des_sources_f77 | wc -w` \
522     || `diff tmp90 liste_des_sources_f90 | wc -w` \
523     || ! -f makefile \
524     || ! -f liste_des_sources_f90 \
525     || ! -f liste_des_sources_f77 ) then
526        echo les fichiers suivants ont ete crees ou detruits
527        echo ou les fichiers suivants sont passes ou ne sont plus en Fortran 90
528        diff liste_des_sources_f77 tmp77
529        diff liste_des_sources_f90 tmp90
530        \cp tmp77 liste_des_sources_f77
531        \cp tmp90 liste_des_sources_f90
532        echo On recree le makefile
533        ./create_make_gcm >! tmp
534        \mv tmp makefile
535        echo Nouveau makefile cree.
536endif
537
538########################################################################
539#  Execution de la comande make
540########################################################################
541
542echo PHYSIQUE $phys
543echo dynamique $dyn $dimension
544echo OPTIM="$optim" $filtre LIBO=$libo $dyn PHYS=$phys DIM=$dimc PROG=$code
545echo PATH pour les fichiers INCLUDE $include
546echo OPLINK="$oplink"
547
548if $HP then
549   set f77='fort77 +OP'
550   set f90='jensaisrien'
551   set opt_link="$opt_link -lm"
552else  if $VPP then
553   set f77=frt
554   set f90=$f77
555else if $CRAY then
556   set f77=f90
557   set f90=f90
558else if $LINUX then
559   set f77=pgf90
560   set f90=pgf90
561else if $SUN then
562   set f77=f90
563   set f90=f90
564else if $NEC then
565   set f77=f90
566   set f90=f90
567else
568   set f77=f77
569   set f90=f90
570endif
571
572cd $model
573
574if $VPP then
575set make="gmake RANLIB=ls"
576else if $CRAY then
577set make="make RANLIB=ls"
578else if $NEC then
579set make="make RANLIB=ls"
580else if $LINUX then
581set make="make -k RANLIB=ranlib"
582else
583set make="make RANLIB=ranlib"
584endif
585
586
587
588#
589# les deux test suivants sont "temporaires" pour pallier des "faiblesses" du
590# compilateur fortran Sun: f90: SC4.0 11 Sep 1995 FORTRAN 90 1.1
591#
592#if ($code == 'create_limit' && $SUN) then
593#   set link=f77
594#   set opt_link="-L$NCDFLIB -lnetcdf"
595#endif
596
597#if ($code == 'create_etat0' && $SUN) then
598#   if ( ! -f $libo/libdyn3d.a ) then
599#     echo "Priere de compiler gcm en premier pour des raisons d'optimisation"
600#     \rm $libf/grid/dimensions.h
601#     exit
602#   endif
603#   set optim=" -dalign "
604#   set optim90=" -dalign -fixed "
605#   set opt_link="-L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf"
606#   set link="$f90 $optim90"
607#   touch $LMDGCM/libf/dyn3d/startvar.F
608#   touch $LMDGCM/libf/dyn3d/etat0_netcdf.F
609#endif
610
611#
612# Encore un test temporaire: probleme de compilation sur VPP
613# l'optimisation de startvar se passe mal
614#
615if ($code == 'create_etat0' && $VPP) then
616   if ( ! -f $libo/libdyn3d.a ) then
617     echo "Priere de compiler gcm en premier pour des raisons d'optimisation"
618     \rm $libf/grid/dimensions.h                                             
619     exit                       
620   endif
621   set optim=" -Wv,-Of,-ilfunc"
622   set optimbis=" -Psia -Aa -Wv,-m3 -Wp,-DVPP -Z $LMDGCM/listage"
623   set optim90="$optim""$optimbis"" -X9 -w"
624   set opt_link="-L$IOIPSLDIR -lioipsl -L$NCDFLIB -lnetcdf"
625   touch $LMDGCM/libf/dyn3d/startvar.F
626   touch $LMDGCM/libf/dyn3d/etat0_netcdf.F
627endif
628
629#################################################################
630# Execution de la comande make... ENFIN!
631#################################################################
632
633if $VPP then
634  set optim90=" $optim90 -Am -M$libo"
635 \cp $IOIPSLDIR/*.mod $libo
636else if $SUN then
637 set optim90=" $optim90 -M$IOIPSLDIR -M$libo "
638 set optim="$optim90"
639 \cp $IOIPSLDIR/*.mod $libo
640else if $NEC then
641 set optim90=" $optim90 -I$libo "
642else if $LINUX then
643 set optim90=" -fast -module $libo "
644 set mod_loc_dir=$libo
645 \cp $IOIPSLDIR/*.mod $libo
646endif
647
648set link="$f90 $optim90"
649
650#if $NEC then
651#  set link="sxld $opt_link"
652#  set ar=sxar
653#endif
654
655
656cd $localdir
657
658
659echo $make -f $LMDGCM/makefile \
660OPTION_DEP="$opt_dep" OPTION_LINK="$opt_link" \
661OPTIM90="$optim90" \
662OPTIM="$optim$optimbis" \
663INCLUDE="$include" \
664$filtre \
665LIBO=$libo \
666$dyn \
667$phys \
668DIM=$dimc \
669L_ADJNT="$adjnt" \
670LOCAL_DIR="$localdir"  \
671F77="$f77" \
672F90="$f90" \
673OPLINK="$oplink" \
674LINK="$link" \
675GCM="$LMDGCM" \
676MOD_LOC_DIR=$mod_loc_dir \
677MOD_SUFFIX=$mod_suffix \
678PROG=$code
679
680$make -f $LMDGCM/makefile \
681OPTION_DEP="$opt_dep" OPTION_LINK="$opt_link" \
682OPTIM90="$optim90" \
683OPTIM="$optim$optimbis" \
684INCLUDE="$include" \
685$filtre \
686LIBO=$libo \
687$dyn \
688$phys \
689DIM=$dimc \
690L_ADJNT="$adjnt" \
691LOCAL_DIR="$localdir"  \
692F77="$f77" \
693F90="$f90" \
694OPLINK="$oplink" \
695LINK="$link" \
696GCM="$LMDGCM" \
697MOD_LOC_DIR=$mod_loc_dir \
698MOD_SUFFIX=$mod_suffix \
699PROG=$code
700
701\rm $libf/grid/dimensions.h
Note: See TracBrowser for help on using the repository browser.