tsipletools.py - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
(HTM) git clone git://src.adamsgaard.dk/pism
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
tsipletools.py (3327B)
---
1 # Copyright (C) 2011, 2012, 2014, 2015, 2017 David Maxwell
2 #
3 # This file is part of PISM.
4 #
5 # PISM is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 3 of the License, or (at your option) any later
8 # version.
9 #
10 # PISM is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 # details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with PISM; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 """Classes for interfacing between PISM and the ``siple`` library."""
20
21 import PISM
22 import siple
23 import petsc4py
24
25
26 class PISMLocalVector(siple.linalg.AbstractVector):
27
28 """Implements the :class:`siple.linalg.linalg_abstract.AbstractVector` interface for few kinds of PISM :cpp:class:`IceModelVec`."""
29
30 def __init__(self, u):
31 if isinstance(u, PISM.IceModelVec2S):
32 self._core = u
33 self.dof = 1
34 elif isinstance(u, PISM.IceModelVec2V):
35 self._core = u
36 self.dof = 2
37 else:
38 raise ValueError("An PISMLocalVector wraps PISM IceModelVec2S or IceModelVec2V: found a %s" % u)
39 self.grid = u.grid()
40
41 def set(self, rhs):
42 self._core.copy_from(rhs._core)
43
44 def acc(self, rhs):
45 self._core.add(1., rhs._core)
46
47 def scale(self, t):
48 self._core.scale(t)
49
50 def axpy(self, t, v):
51 self._core.add(t, v._core)
52
53 def copy(self):
54 c = self.vector_like()
55 c._core.copy_from(self._core)
56 return c
57
58 def vector_like(self):
59 if self.dof == 1:
60 c = PISM.IceModelVec2S()
61 else:
62 c = PISM.IceModelVec2V()
63 c.create(self.grid, "", PISM.WITH_GHOSTS, self._core.stencil_width())
64 return PISMLocalVector(c)
65
66 def zero_like(self):
67 z = self.vector_like()
68 z._core.set(0.)
69 return z
70
71 def dim(self):
72 grid = self._core.grid()
73 return self.dof * grid.Mx() * grid.My()
74
75 def core(self):
76 return self._core
77
78 def norm(self, name):
79
80 if name == 'linf':
81 return self._core.norm(petsc4py.PETSc.NormType.NORM_INFINITY)
82 if name == 'l2':
83 return self._core.norm(petsc4py.PETSc.NormType.NORM_2)
84 if name == 'l1':
85 return self._core.norm(petsc4py.PETSc.NormType.NORM_1)
86
87 raise ValueError()
88
89
90 def pism_logger(message, severity):
91 """Implements a ``siple`` logger that prints output to the terminal."""
92 verbosity = severity
93 PISM.logging.log(message + '\n', verbosity)
94
95
96 def pism_pause(message_in=None, message_out=None):
97 """Implements a ``siple`` pause callback appropriate for parallel runs."""
98 import sys
99 import os
100 fd = sys.stdin.fileno()
101 com = PISM.Context().com
102 if os.isatty(fd):
103 return siple.reporting.std_pause(message_in, message_out)
104 if not message_in is None:
105 PISM.verbPrintf(1, com, message_in + "\n")
106 _ = sys.stdin.read(1)
107 if not message_out is None:
108 PISM.verbPrintf(1, com, message_out + "\n")