PISM, A Parallel Ice Sheet Model  stable v2.1-1-g6902d5502 committed by Ed Bueler on 2023-12-20 08:38:27 -0800
Viewer.cc
Go to the documentation of this file.
1 /* Copyright (C) 2014, 2015, 2017, 2023 PISM Authors
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 
20 #include "pism/util/petscwrappers/Viewer.hh"
21 
22 #include <petscdraw.h>
23 #include <cassert>
24 #include "pism/util/error_handling.hh"
25 
26 namespace pism {
27 namespace petsc {
28 
29 Viewer::Viewer(MPI_Comm com, const std::string &title, unsigned int target_size,
30  double Lx, double Ly) {
31  PetscErrorCode ierr;
32  unsigned int X, Y;
33 
34  compute_size(target_size, Lx, Ly, X, Y);
35 
36  ierr = PetscViewerDrawOpen(com, NULL, title.c_str(),
37  PETSC_DECIDE, PETSC_DECIDE, X, Y, &m_value);
38  PISM_CHK(ierr, "PetscViewerDrawOpen");
39 
40  // following should be redundant, but may put up a title even under 2.3.3-p1:3 where
41  // there is a no titles bug
42  PetscDraw draw;
43  ierr = PetscViewerDrawGetDraw(m_value, 0, &draw);
44  PISM_CHK(ierr, "PetscViewerDrawGetDraw");
45 
46  ierr = PetscDrawSetTitle(draw, title.c_str());
47  PISM_CHK(ierr, "PetscDrawSetTitle");
48 }
49 
50 Viewer::Viewer(MPI_Comm com) {
51  PetscErrorCode ierr = PetscViewerCreate(com, &m_value);
52  PISM_CHK(ierr, "PetscViewerCreate");
53 }
54 
55 Viewer::Viewer(PetscViewer v) {
56  m_value = v;
57 }
58 
60  m_value = NULL;
61 }
62 
64  if (m_value != NULL) {
65  PetscErrorCode ierr = PetscViewerDestroy(&m_value); CHKERRCONTINUE(ierr);
66  }
67 }
68 
69 void Viewer::compute_size(unsigned int target_size, double Lx, double Ly, unsigned int &X, unsigned int &Y) {
70 
71  assert(Lx > 0 && Ly > 0);
72 
73  // aim for smaller dimension equal to target, larger dimension larger by Ly/Lx or Lx/Ly proportion
74  const double yTOx = Ly / Lx;
75  if (Ly > Lx) {
76  X = target_size;
77  Y = (unsigned int) ((double)target_size * yTOx);
78  } else {
79  Y = target_size;
80  X = (unsigned int) ((double)target_size / yTOx);
81  }
82 
83  // if either dimension is larger than twice the target, shrink appropriately
84  if (X > 2 * target_size) {
85  Y = (unsigned int) ((double)(Y) * (2.0 * (double)target_size / (double)(X)));
86  X = 2 * target_size;
87  } else if (Y > 2 * target_size) {
88  X = (unsigned int) ((double)(X) * (2.0 * (double)target_size / (double)(Y)));
89  Y = 2 * target_size;
90  }
91 
92  // make sure minimum dimension is sufficient to see
93  if (X < 20) {
94  X = 20;
95  }
96  if (Y < 20) {
97  Y = 20;
98  }
99 }
100 
101 } // end of namespace petsc
102 } // end of namespace pism
void compute_size(unsigned int target_size, double Lx, double Ly, unsigned int &X, unsigned int &Y)
Definition: Viewer.cc:69
#define PISM_CHK(errcode, name)