Index: trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/eddyflux.py
===================================================================
--- trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/eddyflux.py	(revision 1279)
+++ trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/eddyflux.py	(revision 1279)
@@ -0,0 +1,42 @@
+#! /usr/bin/env python
+from ppclass import pp
+from ppplot import plot2d
+from ppcompute import mean
+import numpy as np
+
+#############################
+ff = "diagfi.nc"
+tt = 240.
+#############################
+
+# perturbation fields
+up = pp(var="u",file=ff,t=tt,compute="pert_x").getf()
+vp = pp(var="v",file=ff,t=tt,compute="pert_x").getf()
+tp = pp(var="temp",file=ff,t=tt,compute="pert_x").getf()
+
+# coordinates
+press = pp(var="p",file="diagfi.nc",t=tt,x=0,y=0).getf()
+lat = np.linspace(-90.,90.,up.shape[1])
+
+# compute <u'v'> etc...
+vptpm = mean(vp*tp,axis=2)
+upvpm = mean(up*vp,axis=2)
+
+# plot
+p = plot2d()
+p.f = upvpm
+p.c = vptpm
+p.x = lat
+p.y = press/100.
+p.title = r"$\overline{u^\prime v^\prime}$"
+p.xlabel = "Latitude"
+p.ylabel = "Pressure (mb)"
+p.units = r"$m^{2}s^{-2}$"
+p.invert = True
+p.logy = True
+p.colorbar = "RdBu_r"
+p.fmt = "%.1f"
+p.vmin = -7
+p.vmax = 7
+p.div = 28
+p.makesave(mode="jpg",filename="eddyflux")
Index: trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/perturbations.py
===================================================================
--- trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/perturbations.py	(revision 1279)
+++ trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/perturbations.py	(revision 1279)
@@ -0,0 +1,63 @@
+#! /usr/bin/env python
+from ppclass import pp
+
+#############################
+xx = 180.
+xx = 0. 
+xm = "-175.,180."
+ff = "diagfi.nc"
+tt = 240.
+#############################
+
+# field
+u = pp(var="u",file=ff,t=tt,x=xx,quiet=True).get()
+v = pp(var="v",file=ff,t=tt,x=xx,quiet=True).get()
+t = pp(var="temp",file=ff,t=tt,x=xx,quiet=True).get()
+
+# zonal mean
+um = pp(var="u",file=ff,t=tt,x=xm,quiet=True).get()
+vm = pp(var="v",file=ff,t=tt,x=xm,quiet=True).get()
+tm = pp(var="temp",file=ff,t=tt,x=xm,quiet=True).get()
+
+# generic plot settings (will be passed through operations)
+u.logy = True
+u.nxticks = 5
+u.ycoeff = 0.01
+u.ylabel = "pressure (mb)"
+u.out = "png"
+# (what follows changes key attributes but harmless in our case, while useful for plot settings)
+v << u ; t << u
+
+# perturbation
+vp = v-vm
+up = u-um
+tp = t-tm
+
+# coupling terms
+vptp = vp*tp
+upvp = up*vp
+uptp = up*tp
+
+# specific plot settings
+vp.title = r"$v^\prime$"
+up.title = r"$u^\prime$"
+tp.title = r"$T^\prime$"
+vptp.title = r"$v^\prime T^\prime$"
+vptp.units = "ms$^{-1}$K"
+vptp.colorbar = "RdBu_r"
+upvp.title = r"$u^\prime v^\prime$"
+upvp.units = "m$^2$s$^{-2}$"
+upvp.colorbar = "RdBu_r"
+uptp.title = r"$u^\prime T^\prime$"
+uptp.units = "ms$^{-1}$K"
+uptp.colorbar = "RdBu_r"
+
+# composite plots
+tp.filename = "saturn_perturbations"
+tp.plot(extraplot=2)
+up.plotin = tp ; up.plot()
+vp.plotin = tp ; vp.plot()
+vptp.filename = "saturn_coupling"
+vptp.plot(extraplot=2)
+uptp.plotin = vptp ; uptp.plot()
+upvp.plotin = vptp ; upvp.plot()
Index: trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/vortimars.py
===================================================================
--- trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/vortimars.py	(revision 1279)
+++ trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/vortimars.py	(revision 1279)
@@ -0,0 +1,51 @@
+#! /usr/bin/env python
+from ppclass import pp
+from ppplot import plot2d
+from ppcompute import divort
+import numpy as np
+
+####################################################
+fff = "/home/aymeric/Big_Data/DATAPLOT/diagfired.nc"
+rad = 3389500
+ttt = 1
+zzz = 10.
+#####################################################
+
+# get wind fields
+u = pp(file=fff,var="u",t=ttt,z=zzz).getf()
+v = pp(file=fff,var="v",t=ttt,z=zzz).getf()
+s = pp(file=fff,var="phisinit",t=ttt).getf()
+   
+# set latitude and longitude arrays
+# -- asuming regular grid!
+ny,nx = u.shape
+lon = np.linspace(-180.,180.,nx)
+lat = np.linspace(90.,-90.,ny)
+   
+# compute vorticity and divergence
+div, vorti = divort(u,v,lon,lat,rad)
+
+##########
+# figure #
+##########
+pl = plot2d()
+# -- mapping stuff
+pl.x = lon
+pl.y = lat
+pl.proj = "cyl"
+pl.mapmode = True
+# -- field: vorticity
+pl.f = vorti*1e5
+pl.trans = 0.5
+pl.colorbar = "RdBu_r"
+pl.vmin = -5.
+pl.vmax = 5.
+pl.fmt = "%.0f"
+# -- contour: topography
+pl.c = s
+# -- vectors: winds
+pl.vx = u
+pl.vy = v
+pl.wscale = 25.
+# -- make the plot
+pl.makesave(mode="jpg",filename="vortimars",includedate=False)
Index: trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/vortisaturn.py
===================================================================
--- trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/vortisaturn.py	(revision 1279)
+++ trunk/UTIL/PYTHON/planetoplot_v2/examples/ppclass_additional/dynanalysis/vortisaturn.py	(revision 1279)
@@ -0,0 +1,50 @@
+#! /usr/bin/env python
+from ppclass import pp
+from ppplot import plot2d
+from ppcompute import divort
+import numpy as np
+
+####################################################
+fff = "diagfi.nc"
+uuu = "u"
+vvv = "v"
+ttt = 1000
+zzz = 1e4
+rad = 60000000
+#####################################################
+
+# get wind fields
+u = pp(file=fff,var="u",t=ttt,z=zzz).getf()
+v = pp(file=fff,var="v",t=ttt,z=zzz).getf()
+   
+# set latitude and longitude arrays
+# -- asuming regular grid!
+ny,nx = u.shape
+lon = np.linspace(-180.,180.,nx)
+lat = np.linspace(90.,-90.,ny)
+   
+# compute vorticity and divergence
+div, vorti = divort(u,v,lon,lat,rad)
+
+##########
+# figure #
+##########
+pl = plot2d()
+# -- mapping stuff
+pl.x = lon
+pl.y = lat
+pl.proj = "cyl"
+pl.mapmode = True
+# -- field: vorticity
+pl.f = vorti*1e6
+pl.colorbar = "RdBu_r"
+pl.vmin = -3.
+pl.vmax = 3.
+pl.fmt = "%.0f"
+# -- make the plot
+pl.makesave(mode="jpg",filename="vortisaturn",includedate=False)
+#pl.f = div
+#pl.makeshow()
+
+
+
Index: trunk/UTIL/PYTHON/planetoplot_v2/pp.py
===================================================================
--- trunk/UTIL/PYTHON/planetoplot_v2/pp.py	(revision 1219)
+++ trunk/UTIL/PYTHON/planetoplot_v2/pp.py	(revision 1279)
@@ -51,5 +51,5 @@
 parser.add_option('-m','--mult',action='store',dest='mult',type="float",default=None,help="multiplicative factor on field")
 parser.add_option('-a','--add',action='store',dest='add',type="float",default=None,help="additive factor on field")
-parser.add_option('-o','--output',action='store',dest='filename',type="string",default="myplot",help="name of output files")
+parser.add_option('-o','--output',action='store',dest='filename',type="string",default=None,help="name of output files")
 parser.add_option('-d','--directory',action='store',dest='folder',type="string",default="./",help="directory of output files")
 parser.add_option('-s','--changetime',action='store',dest='changetime',type="string",default=None,\
@@ -68,5 +68,5 @@
 parser.add_option('-H','--trans',action='store',dest='trans',type="float",default=1.0,help="float for transparency (0=transp,1=opaque)")
 parser.add_option('-Z','--logy',action='store_true',dest='logy',default=False,help="set log for vertical axis")
-parser.add_option('-O','--save',action='store',dest='out',type="string",default="gui",help="save mode: 'gui' 'png' 'pdf' 'eps' 'svg' 'ps'")
+parser.add_option('-O','--save',action='store',dest='out',type="string",default=None,help="save mode: 'gui' 'png' 'pdf' 'eps' 'svg' 'ps'")
 parser.add_option('-V','--void',action='store_true',dest='void',default=False,help="no colorbar, no title, no labels")
 parser.add_option('-U','--units',action='append',dest='units',type="string",default=None,help="units for the field")
@@ -89,5 +89,5 @@
 # -- 2D plot
 parser.add_option('-C','--colorbar',action='append',dest='colorbar',type="string",default=None,help="[2D] colormap: http://micropore.files.wordpress.com/2010/06/colormaps.png")
-parser.add_option('-P','--proj',action='append',dest='proj',type="string",default=None,help="[2D] map projection: 'cyl' 'npstere' 'spstere' 'ortho' 'moll' 'robin' 'lcc' 'laea' 'merc' 'noproj'")
+parser.add_option('-P','--proj',action='store',dest='proj',type="string",default=None,help="[2D] map projection: 'cyl' 'npstere' 'spstere' 'ortho' 'moll' 'robin' 'lcc' 'laea' 'merc'")
 parser.add_option('-B','--back',action='append',dest='back',type="string",default=None,help='[2D] predefined map background (cf. set_back.txt)')
 parser.add_option('-A','--area',action='append',dest='area',type="string",default=None,help='[2D] predefined region of mapping (cf. set_area.txt)')
@@ -154,11 +154,5 @@
 user.folder = opt.folder
 user.out = opt.out
-# if noproj is given for proj, no map mode
-if opt.proj is not None:
-    if 'noproj' in opt.proj: 
-        user.noproj = True
-# if user wants to give a name, we drop the indication of date
-if opt.filename != "myplot":
-    user.includedate = False
+user.proj = opt.proj
 # define plot
 user.defineplot()
@@ -174,7 +168,8 @@
 command = ""
 for arg in sys.argv: command = command + arg + ' '
-try:
+if opt.filename is not None:
+  try:
     f = open(opt.folder+'/'+opt.filename+'.sh', 'w')
     f.write(command)	
-except IOError:
+  except IOError:
     print "!! WARNING !! pp.py command not saved. Probably do not have permission to write here."
Index: trunk/UTIL/PYTHON/planetoplot_v2/ppclass.py
===================================================================
--- trunk/UTIL/PYTHON/planetoplot_v2/ppclass.py	(revision 1219)
+++ trunk/UTIL/PYTHON/planetoplot_v2/ppclass.py	(revision 1279)
@@ -168,12 +168,11 @@
                       verbose=False,\
                       quiet=False,\
-                      noproj=False,\
                       superpose=False,\
                       plotin=None,\
                       forcedimplot=-1,\
-                      out="gui",\
-                      filename="myplot",\
+                      out=None,\
+                      filename=None,\
                       folder="./",\
-                      includedate=True,\
+                      includedate=False,\
                       res=150.,\
                       xlabel=None,ylabel=None,\
@@ -233,5 +232,4 @@
         self.verbose = verbose
         self.quiet = quiet
-        self.noproj = noproj
         self.plotin = plotin
         self.superpose = superpose
@@ -272,8 +270,5 @@
     def printstatus(self):
       if not self.quiet:
-        if self.filename == "THIS_IS_A_CLONE":
-            pass
-        else:
-            print "**** PPCLASS. Done step: " + self.status
+        print "**** PPCLASS. Done step: " + self.status
 
     # print attributes
@@ -303,5 +298,5 @@
             self.kind3d = other.kind3d
             self.verbose = other.verbose
-            self.noproj = other.noproj
+            self.quiet = other.quiet
             self.plotin = other.plotin
             self.superpose = other.superpose
@@ -376,5 +371,5 @@
                setattr(the_clone,k,v)
         the_clone.verbose = False
-        the_clone.filename = "THIS_IS_A_CLONE" # trick to avoid additional outputs
+        the_clone.quiet = True # trick to avoid additional outputs
         the_clone.define()
         for i in range(self.nfin):
@@ -390,5 +385,5 @@
                 setattr(obj,k,v)
         the_clone.status = "retrieved"
-        the_clone.filename = self.filename
+        the_clone.quiet = self.quiet
         return the_clone
 
@@ -886,10 +881,12 @@
                     # specific 2d plot stuff
                     if dp == 2:
+                        plobj.proj = self.proj
+                        plobj.svx = self.svx
+                        plobj.svy = self.svy
                         # -- light grey background for missing values
                         if type(plobj.f).__name__ in 'MaskedArray': plobj.axisbg = '0.75'
                         # -- define if it is a map or a plot
                         plobj.mapmode = ( obj.method_x+obj.method_y == "freefree" \
-                                       and "grid points" not in obj.name_x \
-                                       and not self.noproj )
+                                       and "grid points" not in obj.name_x )
                     # possible user-defined plot settings shared by all plots
                     if self.div is not None: plobj.div = self.div
@@ -919,11 +916,8 @@
                     # -- 2D specific
                     elif dp == 2:
-                        if self.proj is not None and not self.noproj: plobj.proj = self.proj
                         if self.vmin is not None: plobj.vmin = self.vmin
                         if self.vmax is not None: plobj.vmax = self.vmax
                         if self.trans is not None: plobj.trans = self.trans
 			if self.back is not None: plobj.back = self.back
-                        plobj.svx = self.svx
-                        plobj.svy = self.svy
                     # finally append plot object
                     self.p.append(plobj)
@@ -1014,5 +1008,5 @@
             self.customplot = self.p[0].f.ndim == 2 \
                         and self.p[0].mapmode == True \
-                        and self.p[0].proj not in ["ortho"]
+                        and self.p[0].proj not in ["ortho","robin"]
             if self.customplot:
                 margin = 0.07
@@ -1026,4 +1020,5 @@
             self.howmanyplots = self.plotin.howmanyplots
             self.customplot = self.plotin.customplot
+            self.filename = self.plotin.filename
         # LOOP on all subplots
         # NB: cannot use 'for pl in self.p' if self.plotin not None
@@ -1087,11 +1082,12 @@
             mpl.close()
         # SAVE A PICKLE FILE WITH THE self.p ARRAY OF OBJECTS
-        if self.verbose: print "**** Saving session in "+self.filename + ".ppobj"
-        savfile = self.folder + "/" + self.filename + ".ppobj"
-        try: 
-            filehandler = open(savfile, 'w')
-            pickle.dump(self.p, filehandler)
-        except IOError: 
-            if self.verbose: print "!! WARNING !! Saved object file not written. Probably do not have permission to write here."
+        if self.filename is not None:
+          if self.verbose: print "**** Saving session in "+self.filename + ".ppobj"
+          savfile = self.folder + "/" + self.filename + ".ppobj"
+          try: 
+              filehandler = open(savfile, 'w')
+              pickle.dump(self.p, filehandler)
+          except IOError: 
+              if self.verbose: print "!! WARNING !! Saved object file not written. Probably do not have permission to write here."
         return self
 
@@ -1235,10 +1231,5 @@
                 try: self.p[iii].legend = opt.legend[0]
                 except: pass
-            ###
-            try: self.p[iii].proj = opt.proj[iii]
-            except: 
-                try: self.p[iii].proj = opt.proj[0]
-                except: pass
-            ###
+            ####
             try: self.p[iii].back = opt.back[iii]
             except: 
Index: trunk/UTIL/PYTHON/planetoplot_v2/ppcompute.py
===================================================================
--- trunk/UTIL/PYTHON/planetoplot_v2/ppcompute.py	(revision 1219)
+++ trunk/UTIL/PYTHON/planetoplot_v2/ppcompute.py	(revision 1279)
@@ -123,9 +123,14 @@
     mm = mean(field,axis=axis)
     # include back the reduced dim
-    if field.ndim == 4: mm = np.tile(mm,(field.shape[axis],1,1,1))
-    elif field.ndim == 3: mm = np.tile(mm,(field.shape[axis],1,1))
-    elif field.ndim == 2: mm = np.tile(mm,(field.shape[axis],1))
-    # array has right shape but not in good order: fix this.
-    mm = np.reshape(mm,field.shape)
+    if field.ndim == 4:
+      if axis == 0:   mm = mm[np.newaxis,:,:,:]
+      elif axis == 1: mm = mm[:,np.newaxis,:,:]
+      elif axis == 2: mm = mm[:,:,np.newaxis,:]
+      elif axis == 3: mm = mm[:,:,:,np.newaxis]
+    else:
+      print "not supported. yet!"
+      exit()
+    # repeat the calculated mean on this dimension
+    mm = np.repeat(mm,field.shape[axis],axis=axis)
     # compute perturbations
     field = field - mm
@@ -314,2 +319,56 @@
     return time
 
+#########################
+#### FLOW DIAGNOSTIC ####
+#########################
+
+def divort(u,v,lon,lat,rad):
+  ####################
+  # compute divergence and vorticity
+  # div,vorti = divort(u,v,lon,lat,rad)
+  ####################
+  # u: zonal wind
+  # v: meridional wind
+  # lon: longitude
+  # lat: latitude
+  # rad: radius of the planet
+  ####################
+
+  # compute gradients -- with normalized coordinates
+  du_y,du_x = np.gradient(u)
+  dv_y,dv_x = np.gradient(v)
+
+  # convert to radian
+  la = lon*np.pi/180.
+  ph = lat*np.pi/180.
+
+  # ensure 2D arrays for lon,lat
+  if lon.ndim == 1 and lat.ndim == 1:
+    [lar,phr] = np.meshgrid(la,ph)
+  elif lon.ndim == 2 and lat.ndim == 2:
+    lar,phr = la,ph
+  else:
+    print "ppcompute. there is a problem with lat/lon rank. stop."
+    exit()
+
+  # compute normalized gradients for lat/lon grid
+  dump,dla_x = np.gradient(lar)
+  dph_y,dump = np.gradient(phr)
+   
+  # compute cartesian differential coordinates
+  dx = dla_x*rad*np.cos(phr)
+  dy = dph_y*rad
+   
+  # eventually compute cartesian derivatives
+  du_dx = du_x / dx
+  du_dy = du_y / dy
+  dv_dx = dv_x / dx
+  dv_dy = dv_y / dy
+   
+  # vorticity
+  vorti = dv_dx - du_dy
+  div = du_dx + dv_dy 
+
+  return div,vorti
+
+
Index: trunk/UTIL/PYTHON/planetoplot_v2/ppplot.py
===================================================================
--- trunk/UTIL/PYTHON/planetoplot_v2/ppplot.py	(revision 1219)
+++ trunk/UTIL/PYTHON/planetoplot_v2/ppplot.py	(revision 1279)
@@ -299,14 +299,20 @@
     return
 
+# a necessary addition for people used to matplotlib
+def show():
+    mpl.show()
+
 # a generic function to show (GUI) or save a plot (PNG,EPS,PDF,...)
 # -------------------------------
-def save(mode="gui",filename="plot",folder="./",includedate=True,res=150,custom=False):
-    if mode != "nothing":
+def save(mode=None,filename=None,folder="./",includedate=False,res=150,custom=False):
+    # no filename or no mode set --> graphical user interface
+    if filename is None or mode is None:
+      show()
+    # otherwise --> an image is saved
+    else:
       # a few settings
       possiblesave = ['eps','ps','svg','png','jpg','pdf'] 
       # now the main instructions
-      if mode == "gui": 
-          mpl.show()
-      elif mode in possiblesave:
+      if mode in possiblesave:
           ## name of plot
           name = folder+'/'+filename
@@ -327,7 +333,5 @@
           print "!! ERROR !! File format not supported. Supported: ",possiblesave
 
-# a necessary addition for people used to matplotlib
-def show():
-    mpl.show()
+
 
 ##################################
@@ -554,9 +558,11 @@
             ax.xaxis.set_major_locator(MaxNLocator(self.nxticks))
         else:
-            print "!! WARNING. in logx mode, ticks are set automatically."
+            # in logx mode, ticks are set automatically
+            pass
         if not self.logy:
             ax.yaxis.set_major_locator(MaxNLocator(self.nyticks))
         else:
-            print "!! WARNING. in logy mode, ticks are set automatically."
+            # in logy mode, ticks are set automatically
+            pass
         ## specific modulo labels
         if self.modx is not None:
@@ -568,4 +574,11 @@
         self.make()
         mpl.show()
+    # makesave = make + save
+    # -------------------------------
+    def makesave(self,mode="png",filename="plot",includedate=False,res=150):
+        self.make()
+        save(mode=mode,filename=filename,includedate=includedate,res=res)
+        close()
+
 
 ################################
@@ -648,4 +661,7 @@
         ### PRE-SETTINGS
         ############################################################################################
+        # if no projection is set, set mapmode to False
+        if self.proj is None:
+            self.mapmode = False
         # set dummy xy axis if not defined
         if self.x is None: 
@@ -727,9 +743,11 @@
                 ax.xaxis.set_major_locator(MaxNLocator(self.nxticks))
             else:
-                print "!! WARNING. in logx mode, ticks are set automatically."
+                pass
+                #print "!! WARNING. in logx mode, ticks are set automatically."
             if not self.logy:
                 ax.yaxis.set_major_locator(MaxNLocator(self.nyticks))
             else:
-                print "!! WARNING. in logy mode, ticks are set automatically."
+                pass
+                #print "!! WARNING. in logy mode, ticks are set automatically."
             ## specific modulo labels
             if self.modx is not None:
@@ -774,4 +792,5 @@
             if self.proj == "cyl":
                 format = '%.0f'
+                partab = np.r_[-90.,-60.,-30.,0.,30.,60.,90.]
             # ... global projections
             elif self.proj in ["ortho","moll","robin"]:
@@ -782,5 +801,6 @@
                 if self.proj in ["robin"]: steplon = 90.
                 mertab = np.r_[-360.:360.:steplon]
-                partab = np.r_[-90.:90.+steplat:steplat]
+                #partab = np.r_[-90.:90.+steplat:steplat]
+                partab = np.r_[-90.,-30.,0.,30.,90.]
                 if self.proj == "ortho": 
                     merlab = [0,0,0,0] ; parlab = [0,0,0,0]
@@ -847,7 +867,9 @@
             # contour field. first line contour then shaded contour.
             if self.c is not None: 
+                #zelevelsc = np.arange(900.,1100.,5.)
                 objC2 = m.contour(x, y, what_I_contour, \
                             zelevelsc, colors = ccol, linewidths = cline)
                 #mpl.clabel(objC2, inline=1, fontsize=10,manual=True,fmt='-%2.0f$^{\circ}$C',colors='r')
+                #mpl.clabel(objC2, inline=0, fontsize=8, fmt='%.0f',colors='r', inline_spacing=0)
             m.contourf(x, y, what_I_plot, zelevels, cmap = palette, alpha = self.trans, antialiased=True)
         ############################################################################################
@@ -856,6 +878,8 @@
         if self.trans > 0. and self.showcb:
             ## draw colorbar. settings are different with projections. or if not mapmode.
-            if not self.mapmode: orientation=zeorientation ; frac = 0.075 ; pad = 0.03 ; lu = 0.5
+            #if not self.mapmode: orientation=zeorientation ; frac = 0.075 ; pad = 0.03 ; lu = 0.5
+            if not self.mapmode: orientation=zeorientation ; frac = 0.15 ; pad = 0.04 ; lu = 0.5
             elif self.proj in ['moll']: orientation="horizontal" ; frac = 0.08 ; pad = 0.03 ; lu = 1.0
+            elif self.proj in ['robin']: orientation="horizontal" ; frac = 0.07 ; pad = 0.1 ; lu = 1.0
             elif self.proj in ['cyl']: orientation="vertical" ; frac = 0.023 ; pad = 0.03 ; lu = 0.5
             else: orientation = zeorientation ; frac = zefrac ; pad = 0.03 ; lu = 0.5
@@ -932,2 +956,10 @@
         self.make()
         mpl.show()
+
+    # makesave = make + save
+    # -------------------------------
+    def makesave(self,mode="png",filename="plot",includedate=False,res=150):
+        self.make()
+        save(mode=mode,filename=filename,includedate=includedate,res=res)
+        close()
+
