Changeset 9423
- Timestamp:
- 08/25/11 15:11:19 (14 years ago)
- Location:
- issm/trunk/src/m
- Files:
-
- 4 deleted
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk/src/m/classes/model.m ¶
r9405 r9423 16 16 runtimename = {'',false}; %name used when running a parallel job 17 17 counter = {0,false}; 18 domainoutline = {NaN,false};19 riftoutline = {NaN,false};20 iceshelfoutline = {NaN,false};21 icesheetoutline = {NaN,false};22 wateroutline = {NaN,false};23 parameterfile = {NaN,false};24 runmefile = {NaN,false};25 18 26 19 %Mesh … … 109 102 nodeonsurface = {NaN,true,'BooleanMat',1}; 110 103 minh = {0,false}; 111 firn_layer = {NaN,false};112 104 113 105 %Extraction … … 118 110 rho_ice = {0,true,'Double'}; 119 111 rho_water = {0,true,'Double'}; 120 rho_firn = {0,false};121 112 heatcapacity = {0,true,'Double'}; 122 113 latentheat = {0,true,'Double'}; … … 154 145 bed = {NaN,true,'DoubleMat',1}; 155 146 bathymetry = {NaN,true,'DoubleMat',1}; 156 mask = {NaN,false};157 147 158 148 %Boundary conditions … … 171 161 vy_obs = {NaN,true,'DoubleMat',1}; 172 162 vel_obs = {NaN,false}; 173 vx_obs_raw = {NaN,false}; 174 vy_obs_raw = {NaN,false}; 175 vx_bal = {NaN,false}; 176 vy_bal = {NaN,false}; 177 vel_bal = {NaN,false}; 178 vel_obs_raw = {NaN,false}; 179 surface_accumulation_rate = {NaN,true,'DoubleMat',1}; 163 surface_accumulation_rate = {NaN,true,'DoubleMat',3}; 180 164 surface_ablation_rate = {NaN,true,'DoubleMat',1}; 181 165 surface_mass_balance = {NaN,true,'DoubleMat',1}; 182 166 dhdt = {NaN,true,'DoubleMat',1}; 183 167 geothermalflux = {NaN,true,'DoubleMat',1}; 184 observed_temperature = {NaN,false};185 168 thickness_obs = {NaN,true,'DoubleMat',1}; 186 187 %Forcings188 forcings = {struct(),false};189 169 190 170 %Statics parameters … … 207 187 artificial_diffusivity = {0,true,'Integer'}; 208 188 prognostic_DG = {0,true,'Integer'}; 209 deltaH = {0,false};210 DeltaH = {0,false};211 deltaT = {0,false};212 DeltaT = {0,false};213 timeacc = {0,false};214 timedec = {0,false};215 189 hydrostatic_adjustment = {0,true,'Integer'}; 216 190 isprognostic = {0,true,'Boolean'}; … … 237 211 %Output 238 212 requested_outputs = {[],true,'DoubleMat',3}; 239 viscousheating = {NaN,false};240 pressure_elem = {NaN,false};241 stress = {NaN,false};242 stress_surface = {NaN,false};243 stress_bed = {NaN,false};244 deviatoricstress = {NaN,false};245 strainrate = {NaN,false};246 213 %Debugging 247 214 verbose = {0,true,'Integer'}; 248 element_debug = {0,false};249 element_debugid = {NaN,false};250 215 mem_debug = {0,false}; 251 216 gprof = {0,false}; 252 memoryleaks = {NaN,false};253 217 %Results fields 254 218 output_frequency = {0,true,'Integer'}; … … 282 246 outlog = {'',false}; 283 247 errlog = {'',false}; 284 alloc_cleanup = {1,false};285 248 waitonlock = {0,true,'Boolean'}; 286 249 … … 288 251 dummy = {NaN,false}; 289 252 290 %mesh291 mesh_domainoutline = {'',false};292 mesh_riftoutline = {'',false};293 mesh_resolution = {NaN,false};294 295 253 %PETSc and MATLAB solver string 296 254 petscoptions = {NaN,false}; … … 298 256 %Analysis 299 257 solution_type = {'',false}; 300 301 %management of large models302 repository = {'',false};303 258 304 259 %radar power images … … 342 297 groundingline_migration = {0,true,'Integer'}; 343 298 344 %solution parameters345 loadresults = {0,false};346 347 299 %partitioner: 348 300 adjacency = {[],false}; … … 401 353 402 354 case 1 403 %If single argument of class model, we have a copy constructor. 404 if (isa(varargin{1},'model')) 405 md = varargin{1}; 406 elseif (isa(varargin{1},'char')) 407 %user gave us the name of the repository, this model is going to be large! 408 md=model; 409 md.repository=varargin{1}; 410 md=activaterepository(md); 411 elseif (isa(varargin{1},'numeric')) 412 if varargin{1}==0, 355 in=varargin{1}; 356 if (isa(in,'model')) 357 %If single argument of class model, we have a copy constructor. 358 md = in; 359 elseif (isa(in,'numeric') & in==0) 413 360 %just requesting model, without default parameters, do nothing. 414 else415 error('model constructor error message: unknown constructor call');416 end417 361 else 418 error('model constructor error message: copy constructor called on a non''model'' class object');362 error('model constructor error message: unknown constructor for ''model'' class object'); 419 363 end 420 364 … … 424 368 end 425 369 %}}} 426 function md = activaterepository(md) % {{{1427 %ACTIVATEREPOSITORY - save the model fields separately428 %429 % This function is required when a matlab session430 % is running low on memory, or when a model is very large.431 % By activating a repository (for example, 'repository.model'),432 % the model fields will each separately be saved and accessed when433 % needed. This will limit the memory use at the maximum;434 %435 % Usage:436 % md=activaterepository(md)437 438 439 %for each field of the model, we create an equivalent variable, with the same name, which we440 %save in the repository.441 442 modelfields=fields(md);443 444 %then save each of the big fields in their respective files445 for i=1:length(modelfields),446 field=char(modelfields(i));447 eval([field '=md.' field ';']);448 449 %anything NaN, will be saved450 451 if isnumeric(eval(field)),452 if isnan(eval(field)),453 if exist(['.' md.repository '.' field],'file');454 error(['Repository ' md.repository ' already exists! Delete all files starting with .' md.repository ' in your directory, before activating a new repository']);455 end456 eval(['save .' md.repository '.' field ' ' field]);457 end458 end459 end460 end % }}}461 370 function disp(md) % {{{1 462 371 disp(sprintf('\n%s = \n',inputname(1))); … … 492 401 end 493 402 494 %repository495 if ~isempty(md.repository),496 disp(sprintf(' Repository: %s',md.repository));497 end498 499 403 %diverse 500 disp(sprintf(' Mesh: %s',md.repository));404 disp(sprintf(' Mesh:'); 501 405 disp(sprintf('%s%s%s',' Mesh: type ''',inputname(1),'.mesh'' to display')); 502 disp(sprintf(' Parameters: %s',md.repository));406 disp(sprintf(' Parameters:'); 503 407 disp(sprintf('%s%s%s',' Boundary conditions: type ''',inputname(1),'.bc'' to display')); 504 408 disp(sprintf('%s%s%s',' Observations: type ''',inputname(1),'.obs'' to display')); … … 506 410 disp(sprintf('%s%s%s',' Parameters: type ''',inputname(1),'.par'' to display')); 507 411 disp(sprintf('%s%s%s',' ExpPar: type ''',inputname(1),'.exppar'' to display')); 508 disp(sprintf(' Solution parameters: %s' ,md.repository));412 disp(sprintf(' Solution parameters: %s'); 509 413 disp(sprintf('%s%s%s',' Qmu: type ''',inputname(1),'.qmu'' to display')); 510 414 disp(sprintf('%s%s%s',' FLAIM: type ''',inputname(1),'.flaim'' to display')); … … 624 528 md.rho_water=1023; 625 529 626 %firn density (kg/m^3)627 md.rho_firn=830;628 629 530 %ice heat capacity cp (J/kg/K) 630 531 md.heatcapacity=2093; … … 757 658 md.prognostic_DG=0; 758 659 759 %minimum thickness change between 2 time steps (m)760 md.deltaH=10^-2;761 762 %maximum thickness change between 2 time steps (m)763 md.DeltaH=50;764 765 %minimum temperature change between 2 time steps (K)766 md.deltaT=10^-2;767 768 %maximum temperature change between 2 time steps (K)769 md.DeltaT=1;770 771 %When the previous criteria are fulfilled, if the time steps772 %can be accelerated as follows773 %dt = timeacc * dt774 md.timeacc=2;775 776 %When the previous criteria are fulfilled, if the time steps777 %can be reduced as follows778 %dt = timedec * dt779 md.timedec=.5;780 781 660 %Solution activated for transient runs. By default we do a 782 661 %full analysis: Diagnostic, Prognostic and Thermal … … 847 726 md.waitonlock=Inf; 848 727 849 %prerun allocation cleanup850 md.alloc_cleanup=1;851 852 728 %hydrology: from Johnson's 2002 thesis, section 3.5.4 853 729 md.hydro_n=.02; … … 869 745 end 870 746 %}}} 871 function md = subsasgn(md,index,val) % {{{1872 873 if ~isempty(md.repository),874 field=index(1).subs;875 if exist(['.' md.repository '.' field],'file'),876 if length(index)==1,877 %save val in corresponding repository878 eval([field '=val;']);879 eval(['save .' md.repository '.' field ' ' field]);880 else881 %load field from file882 load(['.' md.repository '.' field],'-mat');883 fieldval=eval(field);884 eval([field '=builtin(''subsasgn'',fieldval,index(2),val);']);885 eval(['save .' md.repository '.' field ' ' field]);886 end887 else888 md=builtin('subsasgn',md,index,val);889 end890 else891 md=builtin('subsasgn',md,index,val);892 end893 end %}}}894 747 function result = subsref(md,index) % {{{1 895 748 … … 911 764 if(strcmp(index1.subs,'control')), displaycontrol(md);return; end 912 765 if(strcmp(index1.subs,'parallel')), displayparallel(md);return; end 913 914 if ~isempty(md.repository), 915 %load variable needed, if necessary 916 if exist(['.' md.repository '.' index1.subs],'file'), 917 structure=load(['.' md.repository '.' index1.subs],'-mat'); 918 eval(['result=structure.' index1.subs ';']); 919 else 920 %the file does not exist, just return built in value 921 result=builtin('subsref',md,index); 922 end 923 else 924 %return built in value 925 result=builtin('subsref',md,index); 926 end 927 else 928 if ~isempty(md.repository), 929 if exist(['.' md.repository '.' index(1).subs],'file'), 930 %load variable needed 931 variable=load(['.' md.repository '.' index(1).subs],'-mat'); 932 933 %use temporary structure. 934 result=builtin('subsref',variable,index); 935 else 936 result=builtin('subsref',md,index); 937 end 938 else 939 result=builtin('subsref',md,index); 940 end 941 end 766 end 767 768 %return built in value 769 result=builtin('subsref',md,index); 942 770 end %}}} 943 771 end -
TabularUnified issm/trunk/src/m/classes/organizer.m ¶
r8171 r9423 142 142 if (org.currentstep>length(org.steps)), error(['organizer error message: element with id ' num2str(org.currentstep) ' not found']); end 143 143 144 %before saving model, try and find a runme.m file, and save it.145 A=dbstack;146 if length(A)>=2,147 runmefilename=A(2).file;148 md.runmefile=char(textread(runmefilename,'%s','delimiter','\n'));149 end150 151 144 %save model 152 145 save(name,'md','-v7.3'); -
TabularUnified issm/trunk/src/m/model/collapse.m ¶
r8823 r9423 31 31 if ~isnan(md.surface_mass_balance), md.surface_mass_balance=project2d(md,md.surface_mass_balance,md.numlayers); end; 32 32 if ~isnan(md.dhdt), md.dhdt=project2d(md,md.dhdt,md.numlayers); end; 33 if ~isnan(md.firn_layer), md.firn_layer=project2d(md,md.firn_layer,md.numlayers); end;34 33 35 34 %results … … 79 78 %special for thermal modeling: 80 79 md.basal_melting_rate=project2d(md,md.basal_melting_rate,1); 81 md.observed_temperature=DepthAverage(md,md.observed_temperature);82 80 md.geothermalflux=project2d(md,md.geothermalflux,1); %bedrock only gets geothermal flux 83 81 -
TabularUnified issm/trunk/src/m/model/extrude.m ¶
r9184 r9423 154 154 md.surface_ablation_rate=project3d(md,'vector',md.surface_ablation_rate,'type','node'); 155 155 md.dhdt=project3d(md,'vector',md.dhdt,'type','node'); 156 md.firn_layer=project3d(md,'vector',md.firn_layer,'type','node','layer',md.numlayers);157 156 158 157 %results … … 243 242 %special for thermal modeling: 244 243 md.basal_melting_rate=project3d(md,'vector',md.basal_melting_rate,'type','node','layer',1); 245 md.observed_temperature=project3d(md,'vector',md.observed_temperature,'type','node');246 244 if ~isnan(md.geothermalflux) 247 245 md.geothermalflux=project3d(md,'vector',md.geothermalflux,'type','node','layer',1); %bedrock only gets geothermal flux 248 246 end 249 250 %mask:251 md.mask=project3d(md,'vector',md.mask,'type','node');252 247 253 248 %increase connectivity if less than 25: -
TabularUnified issm/trunk/src/m/model/geography.m ¶
r8298 r9423 59 59 md.nodeonwater=zeros(md.numberofnodes,1); 60 60 md.elementonwater=zeros(md.numberofelements,1); 61 62 %Keep track of input files63 if (strcmp(iceshelfname,'') | strcmp(iceshelfname,'all')),64 md.iceshelfoutline=iceshelfname;65 elseif ischar(iceshelfname),66 md.iceshelfoutline=char(textread(iceshelfname,'%s','delimiter','\n'));67 else68 md.iceshelfoutline=iceshelfname;69 end70 if (strcmp(icesheetname,'') | strcmp(icesheetname,'all')),71 md.icesheetoutline=icesheetname;72 elseif ischar(icesheetname),73 md.icesheetoutline=char(textread(icesheetname,'%s','delimiter','\n'));74 else75 md.icesheetoutline=icesheetname;76 end -
TabularUnified issm/trunk/src/m/model/mechanicalproperties.m ¶
r8298 r9423 4 4 % this routine computes the components of the stress tensor 5 5 % strain rate tensor and their respective principal directions. 6 % the results are in the model md: md. stress and md.strainrate6 % the results are in the model md: md.results 7 7 % 8 8 % Usage: … … 94 94 stress.principalaxis1=directionsstress(:,3:4); 95 95 stress.effectivevalue=1/sqrt(2)*sqrt(stress.xx.^2+stress.yy.^2+2*stress.xy.^2); 96 md. stress=stress;96 md.results.stress=stress; 97 97 98 98 strainrate=struct('xx',[],'yy',[],'xy',[],'principalvalue1',[],'principalaxis1',[],'principalvalue2',[],'principalaxis2',[],'effectivevalue',[]); … … 105 105 strainrate.principalaxis1=directionsstrain(:,3:4); 106 106 strainrate.effectivevalue=1/sqrt(2)*sqrt(strainrate.xx.^2+strainrate.yy.^2+2*strainrate.xy.^2); 107 md. strainrate=strainrate;107 md.results.strainrate=strainrate; 108 108 109 109 deviatoricstress=struct('xx',[],'yy',[],'xy',[],'principalvalue1',[],'principalaxis1',[],'principalvalue2',[],'principalaxis2',[],'effectivevalue',[]); … … 116 116 deviatoricstress.principalaxis1=directionsstress(:,3:4); 117 117 deviatoricstress.effectivevalue=1/sqrt(2)*sqrt(stress.xx.^2+stress.yy.^2+2*stress.xy.^2); 118 md. deviatoricstress=deviatoricstress;118 md.results.deviatoricstress=deviatoricstress; -
TabularUnified issm/trunk/src/m/model/mesh/mesh.m ¶
r8298 r9423 82 82 md.elementconnectivity=ElementConnectivity(md.elements,md.nodeconnectivity); 83 83 84 %outline names85 md.domainoutline=char(textread(domainname,'%s','delimiter','\n'));86 if strcmp(riftname,''),87 md.riftoutline='';88 else89 md.riftoutline=readfile(riftname);90 end91 92 84 %type of model 93 85 md.dim=2; -
TabularUnified issm/trunk/src/m/model/mesh/meshnodensity.m ¶
r8298 r9423 68 68 md.elementconnectivity=ElementConnectivity(md.elements,md.nodeconnectivity); 69 69 70 %outline names71 md.domainoutline=char(textread(domainname,'%s','delimiter','\n'));72 if strcmp(riftname,''),73 md.riftoutline='';74 else75 md.riftoutline=readfile(riftname);76 end77 78 70 %type of model 79 71 md.dim=2; -
TabularUnified issm/trunk/src/m/model/parameterization/parameterize.m ¶
r9181 r9423 68 68 end 69 69 70 %Keep track of parameter file71 md.parameterfile=char(textread(parametername,'%s','delimiter','\n'));72 73 70 %Name and notes 74 71 if isempty(md.name), -
TabularUnified issm/trunk/src/m/model/plot/plot_tensor.m ¶
r2439 r9423 15 15 16 16 %Figure out tensor type: 17 %FIXME does not work anymore 17 18 if strncmpi(type,'strain',6), 18 19 tensor=md.strainrate; -
TabularUnified issm/trunk/src/m/model/process_solve_options.m ¶
r9401 r9423 9 9 %solution_type: check on this option, error out otherwise 10 10 solution_type=getfieldvalue(options,'solution_type'); 11 if ischar(solution_type), error(['only Enums are supported as ''solution_type''. For example: md=solve(md,''solution_type'',DiagnosticSolutionEnum); ']); end12 11 if ~ismember(solution_type,[DiagnosticSolutionEnum,PrognosticSolutionEnum,ThermalSolutionEnum,... 13 12 SteadystateSolutionEnum,ParametersSolutionEnum,TransientSolutionEnum,EnthalpySolutionEnum,... … … 19 18 outoptions.upload=getfieldvalue(options,'upload','off'); 20 19 outoptions.batch=getfieldvalue(options,'batch','no'); 20 outoptions.loadonly=getfieldvalue(options,'loadonly','no'); 21 21 outoptions.directory=getfieldvalue(options,'directory',''); 22 22 -
TabularUnified issm/trunk/src/m/model/solveparallel.m ¶
r8577 r9423 8 8 cluster=md.cluster; 9 9 10 if ~md.loadresults, 10 if options.loadonly, 11 md=loadresultsfromcluster(md); 12 else 11 13 12 14 %First, build a runtime name that is unique, that we will use to create … … 45 47 error('solveparallel done uploading test decks'); 46 48 end 47 else 48 %just load results 49 md=loadresultsfromcluster(md); 49 50 50 end -
TabularUnified issm/trunk/src/m/utils/BC/SetIceSheetBC.m ¶
r9407 r9423 36 36 if isnan(md.surface_accumulation_rate), 37 37 md.surface_accumulation_rate=zeros(md.numberofnodes,1); 38 md.forcings.surface_accumulation_rate=zeros(md.numberofnodes+1,1);39 38 disp(' no surface_accumulation_rate specified: values set as zero'); 40 39 end 41 40 if isnan(md.surface_ablation_rate), 42 41 md.surface_ablation_rate=zeros(md.numberofnodes,1); 43 md.forcings.surface_ablation_rate=zeros(md.numberofnodes+1,1);44 42 disp(' no surface_ablation_rate specified: values set as zero'); 45 43 end 46 44 if isnan(md.surface_mass_balance), 47 45 md.surface_mass_balance=zeros(md.numberofnodes,1); 48 md.forcings.surface_mass_balance=zeros(md.numberofnodes+1,1);49 46 disp(' no surface_mass_balance specified: values set as zero'); 50 47 end … … 60 57 md.spcthickness=NaN*ones(md.numberofnodes,1); 61 58 62 if (length(md. observed_temperature)==md.numberofnodes),59 if (length(md.temperature)==md.numberofnodes), 63 60 md.spctemperature=NaN*ones(md.numberofnodes,1); 64 pos=find(md.nodeonsurface); md.spctemperature(pos)=md. observed_temperature(pos); %impose observed temperature on surface61 pos=find(md.nodeonsurface); md.spctemperature(pos)=md.temperature(pos); %impose observed temperature on surface 65 62 if (length(md.geothermalflux)~=md.numberofnodes), 66 63 md.geothermalflux=50*10^-3*ones(md.numberofnodes,1); %50 mW/m^2 -
TabularUnified issm/trunk/src/m/utils/BC/SetIceShelfBC.m ¶
r9075 r9423 68 68 if isnan(md.surface_accumulation_rate), 69 69 md.surface_accumulation_rate=zeros(md.numberofnodes,1); 70 md.forcings.surface_accumulation_rate=zeros(md.numberofnodes+1,1);71 70 disp(' no surface_accumulation_rate specified: values set as zero'); 72 71 end 73 72 if isnan(md.surface_ablation_rate), 74 73 md.surface_ablation_rate=zeros(md.numberofnodes,1); 75 md.forcings.surface_ablation_rate=zeros(md.numberofnodes+1,1);76 74 disp(' no surface_ablation_rate specified: values set as zero'); 77 75 end 78 76 if isnan(md.surface_mass_balance), 79 77 md.surface_mass_balance=zeros(md.numberofnodes,1); 80 md.forcings.surface_mass_balance=zeros(md.numberofnodes+1,1);81 78 disp(' no surface_mass_balance specified: values set as zero'); 82 79 end … … 92 89 md.spcthickness=NaN*ones(md.numberofnodes,1); 93 90 94 if (length(md. observed_temperature)==md.numberofnodes),91 if (length(md.temperature)==md.numberofnodes), 95 92 md.spctemperature=NaN*ones(md.numberofnodes,1); 96 pos=find(md.nodeonsurface); md.spctemperature(pos)=md. observed_temperature(pos); %impose observed temperature on surface93 pos=find(md.nodeonsurface); md.spctemperature(pos)=md.temperature(pos); %impose observed temperature on surface 97 94 if (length(md.geothermalflux)~=md.numberofnodes), 98 95 md.geothermalflux=zeros(md.numberofnodes,1); -
TabularUnified issm/trunk/src/m/utils/BC/SetMarineIceSheetBC.m ¶
r9075 r9423 79 79 if isnan(md.surface_accumulation_rate), 80 80 md.surface_accumulation_rate=zeros(md.numberofnodes,1); 81 md.forcings.surface_accumulation_rate=zeros(md.numberofnodes+1,1);82 81 disp(' no surface_accumulation_rate specified: values set as zero'); 83 82 end 84 83 if isnan(md.surface_ablation_rate), 85 84 md.surface_ablation_rate=zeros(md.numberofnodes,1); 86 md.forcings.surface_ablation_rate=zeros(md.numberofnodes+1,1);87 85 disp(' no surface_ablation_rate specified: values set as zero'); 88 86 end 89 87 if isnan(md.surface_mass_balance), 90 88 md.surface_mass_balance=zeros(md.numberofnodes,1); 91 md.forcings.surface_mass_balance=zeros(md.numberofnodes+1,1);92 89 disp(' no surface_mass_balance specified: values set as zero'); 93 90 end … … 103 100 md.spcthickness=NaN*ones(md.numberofnodes,1); 104 101 105 if (length(md. observed_temperature)==md.numberofnodes),102 if (length(md.temperature)==md.numberofnodes), 106 103 md.spctemperature=NaN*ones(md.numberofnodes,1); 107 pos=find(md.nodeonsurface); md.spctemperature(pos)=md. observed_temperature(pos); %impose observed temperature on surface104 pos=find(md.nodeonsurface); md.spctemperature(pos)=md.temperature(pos); %impose observed temperature on surface 108 105 if (length(md.geothermalflux)~=md.numberofnodes), 109 106 md.geothermalflux=zeros(md.numberofnodes,1); -
TabularUnified issm/trunk/src/m/utils/Interp/PatchToVec.m ¶
r9085 r9423 4 4 % Usage: 5 5 % vec=PatchToVec(Patch) 6 7 connectivity=sparse(Patch.index(:),1,1); 8 value =sparse(Patch.index(:),1,Patch.value(:)); 9 vec=full(value./connectivity); 10 return; 6 11 7 12 %if the patch is P0: we have element values, return an element vector -
TabularUnified issm/trunk/src/m/utils/Mesh/argusmesh.m ¶
r8298 r9423 89 89 md.counter=1; 90 90 md.dim=2; 91 md.riftoutline='';92 md.domainoutline=['' infile ''];93 91 md=addnote(md,notes); 94 92 -
TabularUnified issm/trunk/src/m/utils/Mesh/squaremesh.m ¶
r8298 r9423 79 79 md.dim=2; 80 80 md.counter=1; 81 md.riftoutline='';82 md.domainoutline='Square';
Note:
See TracChangeset
for help on using the changeset viewer.