00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <sstream>
00020 #include <cstring>
00021 #include <cmath>
00022 #include <petscda.h>
00023 #include <petscksp.h>
00024 #include "iceModel.hh"
00025
00027
00032 PetscErrorCode IceModel::update_viewers() {
00033 PetscErrorCode ierr;
00034 set<string>::iterator i;
00035
00036 PetscInt viewer_size = (PetscInt)config.get("viewer_size");
00037 PetscScalar slice_level = config.get("slice_level");
00038
00039
00040 for (i = map_viewers.begin(); i != map_viewers.end(); ++i) {
00041 IceModelVec *v = variables.get(*i);
00042
00043
00044 if (v == NULL) {
00045 ierr = compute_by_name(*i, v); CHKERRQ(ierr);
00046 }
00047
00048
00049 if (v == NULL)
00050 continue;
00051
00052 GridType dims = v->grid_type();
00053
00054 switch(dims) {
00055 case GRID_2D:
00056 {
00057 IceModelVec2 *v2 = dynamic_cast<IceModelVec2*>(v);
00058 if (v2 == NULL) SETERRQ(1,"grid_type() returns GRID_2D but dynamic_cast gives a NULL");
00059 ierr = v2->view(viewer_size); CHKERRQ(ierr);
00060 break;
00061 }
00062 case GRID_3D:
00063 {
00064 IceModelVec3 *v3 = dynamic_cast<IceModelVec3*>(v);
00065 if (v3 == NULL) SETERRQ(1,"grid_type() returns GRID_3D but dynamic_cast gives a NULL");
00066 ierr = v3->view_surface(vH, viewer_size); CHKERRQ(ierr);
00067 break;
00068 }
00069 case GRID_3D_BEDROCK:
00070 {
00071 ierr = PetscPrintf(grid.com,
00072 "PISM ERROR: map-plane views of bedrock quantities are not supported.\n");
00073 CHKERRQ(ierr);
00074 PetscEnd();
00075 }
00076 }
00077 }
00078
00079
00080 for (i = slice_viewers.begin(); i != slice_viewers.end(); ++i) {
00081 IceModelVec *v = variables.get(*i);
00082
00083
00084 if (v == NULL) {
00085 ierr = compute_by_name(*i, v); CHKERRQ(ierr);
00086 }
00087
00088
00089 if (v == NULL)
00090 continue;
00091
00092 GridType dims = v->grid_type();
00093
00094
00095 if (dims == GRID_2D) {
00096 ierr = verbPrintf(2, grid.com, "PISM WARNING: Please use -view instead of -view_slice to view 2D fields.\n");
00097 continue;
00098 }
00099
00100 if (dims == GRID_3D) {
00101 IceModelVec3 *v3 = dynamic_cast<IceModelVec3*>(v);
00102 if (v3 == NULL) SETERRQ(1,"grid_type() returns GRID_3D but dynamic_cast gives a NULL");
00103 ierr = v3->view_horizontal_slice(slice_level, viewer_size); CHKERRQ(ierr);
00104 }
00105 }
00106
00107
00108 for (i = sounding_viewers.begin(); i != sounding_viewers.end(); ++i) {
00109 IceModelVec *v = variables.get(*i);
00110
00111
00112 if (v == NULL) {
00113 ierr = compute_by_name(*i, v); CHKERRQ(ierr);
00114 }
00115
00116
00117 if (v == NULL)
00118 continue;
00119
00120 GridType dims = v->grid_type();
00121
00122
00123 if (dims == GRID_2D) {
00124 ierr = PetscPrintf(grid.com, "PISM ERROR: soundings of 2D quantities are not supported.\n");
00125 PetscEnd();
00126 }
00127
00128 if (dims == GRID_3D) {
00129 IceModelVec3 *v3 = dynamic_cast<IceModelVec3*>(v);
00130 if (v3 == NULL) SETERRQ(1,"grid_type() returns GRID_3D but dynamic_cast gives a NULL");
00131 ierr = v3->view_sounding(id, jd, viewer_size); CHKERRQ(ierr);
00132 }
00133
00134 if (dims == GRID_3D_BEDROCK) {
00135 IceModelVec3Bedrock *v3 = dynamic_cast<IceModelVec3Bedrock*>(v);
00136 if (v3 == NULL) SETERRQ(1,"grid_type() returns GRID_3D_BEDROCK but dynamic_cast gives a NULL");
00137 ierr = v3->view_sounding(id, jd, viewer_size); CHKERRQ(ierr);
00138 }
00139 }
00140 return 0;
00141 }
00142
00144 PetscErrorCode IceModel::init_viewers() {
00145 PetscErrorCode ierr;
00146 PetscTruth flag;
00147 char tmp[TEMPORARY_STRING_LENGTH];
00148
00149 ierr = PetscOptionsBegin(grid.com, PETSC_NULL,
00150 "Options controlling run-time diagnostic viewers",
00151 PETSC_NULL); CHKERRQ(ierr);
00152
00153
00154 ierr = PetscOptionsString("-view_map", "specifies the comma-separated list of map-plane viewers", "", "empty",
00155 tmp, TEMPORARY_STRING_LENGTH, &flag); CHKERRQ(ierr);
00156 string var_name;
00157 if (flag) {
00158 istringstream arg(tmp);
00159
00160 while (getline(arg, var_name, ',')) {
00161 if (var_name == "diffusivity")
00162 view_diffusivity = true;
00163 else if (var_name == "log_nuH")
00164 view_log_nuH = true;
00165 else if (var_name == "nuH")
00166 view_nuH = true;
00167 else
00168 map_viewers.insert(var_name);
00169 }
00170 }
00171
00172
00173 ierr = PetscOptionsString("-view_slice", "specifies the comma-separated list of horizontal-slice viewers", "", "empty",
00174 tmp, TEMPORARY_STRING_LENGTH, &flag); CHKERRQ(ierr);
00175 if (flag) {
00176 istringstream arg(tmp);
00177
00178 while (getline(arg, var_name, ','))
00179 slice_viewers.insert(var_name);
00180 }
00181
00182
00183 ierr = PetscOptionsString("-view_sounding", "specifies the comma-separated list of sounding viewers", "", "empty",
00184 tmp, TEMPORARY_STRING_LENGTH, &flag); CHKERRQ(ierr);
00185 if (flag) {
00186 istringstream arg(tmp);
00187
00188 while (getline(arg, var_name, ','))
00189 sounding_viewers.insert(var_name);
00190 }
00191
00192 PetscInt viewer_size = (PetscInt)config.get("viewer_size");
00193 ierr = PetscOptionsInt("-view_size", "specifies desired viewer size",
00194 "", viewer_size, &viewer_size, &flag); CHKERRQ(ierr);
00195
00196 if (flag)
00197 config.set("viewer_size", viewer_size);
00198
00199 PetscScalar slice_level = config.get("slice_level");
00200 ierr = PetscOptionsReal("-view_slice_level", "sets the level (in meters above the base of ice) for slice viewers", "",
00201 slice_level, &slice_level, PETSC_NULL); CHKERRQ(ierr);
00202 if ( (slice_level > grid.Lz) || (slice_level < 0) ) {
00203 ierr = verbPrintf(2, grid.com,
00204 "PISM WARNING: Slice level has to be positive and less than Lz (%3.3f).\n"
00205 " Disabling slice viewers...\n",
00206 grid.Lz);
00207 slice_viewers.clear();
00208 } else {
00209 config.set("slice_level", slice_level);
00210 }
00211
00212
00213 ierr = PetscOptionsEnd(); CHKERRQ(ierr);
00214
00215 return 0;
00216 }
00217
00218
00220 PetscErrorCode IceModel::update_nu_viewers(IceModelVec2S vNu[2], IceModelVec2S [2], bool ) {
00221
00222
00223 PetscErrorCode ierr;
00224 if (view_log_nuH) {
00225 PetscScalar **nui, **nuj, **gg;
00226 ierr = vWork2d[4].get_array(gg); CHKERRQ(ierr);
00227 ierr = vNu[0].get_array(nui); CHKERRQ(ierr);
00228 ierr = vNu[1].get_array(nuj); CHKERRQ(ierr);
00229 for (PetscInt i=grid.xs; i<grid.xs+grid.xm; ++i) {
00230 for (PetscInt j=grid.ys; j<grid.ys+grid.ym; ++j) {
00231 const PetscReal avnu = 0.5 * (nui[i][j] + nuj[i][j]);
00232 if (avnu > 1.0e14) {
00233 gg[i][j] = log10(avnu);
00234 } else {
00235 gg[i][j] = 14.0;
00236 }
00237 }
00238 }
00239 ierr = vNu[0].end_access(); CHKERRQ(ierr);
00240 ierr = vNu[1].end_access(); CHKERRQ(ierr);
00241 ierr = vWork2d[4].end_access(); CHKERRQ(ierr);
00242
00243 ierr = vWork2d[4].set_name("log10(nuH)"); CHKERRQ(ierr);
00244 ierr = vWork2d[4].view(300); CHKERRQ(ierr);
00245 }
00246
00247 if (view_nuH) {
00248 ierr = vNu[0].set_name("nuH[0]"); CHKERRQ(ierr);
00249 ierr = vNu[0].view(300); CHKERRQ(ierr);
00250 ierr = vNu[1].set_name("nuH[1]"); CHKERRQ(ierr);
00251 ierr = vNu[1].view(300); CHKERRQ(ierr);
00252 }
00253
00254 return 0;
00255 }
00256