[petsc] 04/04: checkout listLogic.js from upstream branch
Drew Parsons
dparsons at moszumanska.debian.org
Sat Jul 30 02:43:44 UTC 2016
This is an automated email from the git hooks/post-receive script.
dparsons pushed a commit to branch experimental
in repository petsc.
commit 29d9ede1799ddf788fbcf03efcd8fe1fc8de5d5d
Author: Drew Parsons <dparsons at debian.org>
Date: Sat Jul 30 09:49:17 2016 +0800
checkout listLogic.js from upstream branch
the carriage returns in the file were fixed upstream in 3.7.3
---
share/petsc/saws/js/listLogic.js | 1452 +++++++++++++++++++-------------------
1 file changed, 726 insertions(+), 726 deletions(-)
diff --git a/share/petsc/saws/js/listLogic.js b/share/petsc/saws/js/listLogic.js
index 3c89486..b669183 100644
--- a/share/petsc/saws/js/listLogic.js
+++ b/share/petsc/saws/js/listLogic.js
@@ -1,726 +1,726 @@
-/*
- This function is called when a pc_type option is changed (new options may need to be displayed and/or old ones removed
-*/
-
-$(document).on("change","select[id^='pc_type']",function() {
-
- //get the pc option
- var pcValue = $(this).val();
- var id = $(this).attr("id"); //really should not be used in this method. there are better ways of getting information
- var endtag = id.substring(id.indexOf("0"),id.length);
- var parentDiv = "solver" + endtag;
-
- removeAllChildren(endtag); //this function also changes matInfo as needed
-
- //record pc_type in matInfo
- matInfo[endtag].pc_type = pcValue;
-
- if (pcValue == "mg") {
- var defaults = getDefaults("mg",matInfo[endtag].symm, matInfo[endtag].posdef, matInfo[endtag].logstruc);
- var defaultMgLevels = defaults.pc_mg_levels;
-
- matInfo[endtag].pc_mg_levels = defaultMgLevels;
- matInfo[endtag].pc_mg_type = defaults.pc_mg_type;
-
- //first add options related to multigrid (pc_mg_type and pc_mg_levels)
- $("#" + parentDiv).append("<br><b>MG Type </b><select id=\"pc_mg_type" + endtag + "\"></select>");
- $("#" + parentDiv).append("<br><b>MG Levels </b><input type='text' id=\'pc_mg_levels" + endtag + "\' maxlength='4'>");
-
- populateList("mg",endtag);
-
- $("#pc_mg_levels" + endtag).val(defaultMgLevels);
- $("#pc_mg_type" + endtag).val(defaults.pc_mg_type);
-
- //display options for each level
- for(var i=defaultMgLevels-1; i>=0; i--) {
- var childEndtag = endtag + "_" + i;
-
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit !!
- posdef: matInfo[endtag].posdef,
- logstruc: matInfo[endtag].logstruc
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
-
- $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
- if(i == 0) //coarse grid solver (level 0)
- $("#solver" + childEndtag).append("<br><b>Coarse Grid Solver (Level 0) </b>");
- else
- $("#solver" + childEndtag).append("<br><b>Smoothing (Level " + i + ") </b>");
-
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
-
- }
-
- else if(pcValue == "gamg") {
- var defaults = getDefaults("gamg",matInfo[endtag].symm, matInfo[endtag].posdef, matInfo[endtag].logstruc);
- var defaultGamgLevels = defaults.pc_gamg_levels;
-
- matInfo[endtag].pc_gamg_levels = defaultGamgLevels;
- matInfo[endtag].pc_gamg_type = defaults.pc_gamg_type;
-
- //first add options related to multigrid (pc_gamg_type and pc_gamg_levels)
- $("#" + parentDiv).append("<br><b>GAMG Type </b><select id=\"pc_gamg_type" + endtag + "\"></select>");
- $("#" + parentDiv).append("<br><b>GAMG Levels </b><input type='text' id=\'pc_gamg_levels" + endtag + "\' maxlength='4'>");
-
- populateList("gamg",endtag);
-
- $("#pc_gamg_levels" + endtag).val(defaultGamgLevels);
- $("#pc_gamg_type" + endtag).val(defaults.pc_gamg_type);
-
- //display options for each level
- for(var i=defaultGamgLevels-1; i>=0; i--) {
- var childEndtag = endtag + "_" + i;
-
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit !!
- posdef: matInfo[endtag].posdef,
- logstruc: matInfo[endtag].logstruc
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
-
- $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
- if(i == 0) //coarse grid solver (level 0)
- $("#solver" + childEndtag).append("<br><b>Coarse Grid Solver (Level 0) </b>");
- else
- $("#solver" + childEndtag).append("<br><b>Smoothing (Level " + i + ") </b>");
-
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
-
- }
-
- else if (pcValue == "redundant") {
- var defaults = getDefaults("redundant",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
- var defaultRedundantNumber = defaults.pc_redundant_number;
- var childEndtag = endtag + "_0";
-
- matInfo[endtag].pc_redundant_number = defaultRedundantNumber;
-
- //first add options related to redundant (pc_redundant_number)
- $("#" + parentDiv).append("<br><b>Redundant Number </b><input type='text' id=\'pc_redundant_number" + endtag + "\' maxlength='4'>");
- $("#pc_redundant_number" + endtag).val(defaultRedundantNumber);
-
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit!!
- posdef: matInfo[endtag].posdef,
- logstruc: matInfo[endtag].logstruc
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
- $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
- $("#solver" + childEndtag).append("<br><b>Redundant Solver Options </b>");
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
-
- else if (pcValue == "bjacobi") {
- var defaults = getDefaults("bjacobi",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
- var defaultBjacobiBlocks = defaults.pc_bjacobi_blocks;
- var childEndtag = endtag + "_0";
-
- matInfo[endtag].pc_bjacobi_blocks = defaultBjacobiBlocks;
-
- //first add options related to bjacobi (pc_bjacobi_blocks)
- $("#" + parentDiv).append("<br><b>Bjacobi Blocks </b><input type='text' id=\'pc_bjacobi_blocks" + endtag + "\' maxlength='4'>");
- $("#pc_bjacobi_blocks" + endtag).val(defaultBjacobiBlocks);
-
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit!!
- posdef: matInfo[endtag].posdef,
- logstruc: matInfo[endtag].logstruc
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
-
- $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
-
- $("#solver" + childEndtag).append("<br><b>Bjacobi Solver Options </b>");
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
-
- else if (pcValue == "asm") {
- var defaults = getDefaults("asm",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
-
- var defaultAsmBlocks = defaults.pc_asm_blocks;
- var defaultAsmOverlap = defaults.pc_asm_overlap;
- var childEndtag = endtag + "_0";
-
- matInfo[endtag].pc_asm_blocks = defaultAsmBlocks;
- matInfo[endtag].pc_asm_overlap = defaultAsmOverlap;
-
- //first add options related to ASM
- $("#" + parentDiv).append("<br><b>ASM blocks </b><input type='text' id=\"pc_asm_blocks" + endtag + "\" maxlength='4'>");
- $("#" + parentDiv).append("<br><b>ASM overlap </b><input type='text' id=\"pc_asm_overlap" + endtag + "\" maxlength='4'>");
- $("#pc_asm_blocks" + endtag).val(defaultAsmBlocks);
- $("#pc_asm_overlap" + endtag).val(defaultAsmOverlap);
-
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit!!
- posdef: matInfo[endtag].posdef,
- logstruc: matInfo[endtag].logstruc
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
-
- $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
-
- $("#solver" + childEndtag).append("<br><b>ASM Solver Options </b>");
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
-
- else if (pcValue == "ksp") {
- var defaults = getDefaults("ksp",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
- var childEndtag = endtag + "_0";
-
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit!!
- posdef: matInfo[endtag].posdef,
- logstruc: matInfo[endtag].logstruc
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
-
- $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
-
- $("#solver" + childEndtag).append("<br><b>KSP Solver Options </b>");
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
-
- else if (pcValue == "fieldsplit") {
- /*if(!matInfo[endtag].logstruc) {//do nothing if not logstruc
- alert("Error: Fieldsplit can only be used on logically block-structured matrix!");
- return;
- }*/
- var defaults = getDefaults("fieldsplit",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
- var defaultFieldsplitBlocks = defaults.pc_fieldsplit_blocks;
-
- matInfo[endtag].pc_fieldsplit_type = defaults.pc_fieldsplit_type;
- matInfo[endtag].pc_fieldsplit_blocks = defaults.pc_fieldsplit_blocks;
-
- //first add options related to fieldsplit (pc_fieldsplit_type and pc_fieldsplit_blocks)
- $("#" + parentDiv).append("<br><b>Fieldsplit Type </b><select id=\"pc_fieldsplit_type" + endtag + "\"></select>");
- $("#" + parentDiv).append("<br><b>Fieldsplit Blocks </b><input type='text' id=\"pc_fieldsplit_blocks" + endtag + "\" maxlength='4'>");
-
- populateList("fieldsplit",endtag);
-
- $("#pc_fieldsplit_blocks" + endtag).val(defaultFieldsplitBlocks);
- $("#pc_fieldsplit_type" + endtag).val(defaults.pc_fieldsplit_type);
-
- for(var i=defaultFieldsplitBlocks-1; i>=0; i--) {
- var childEndtag = endtag + "_" + i;
-
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit!!
- posdef: matInfo[endtag].posdef,
- logstruc: false //this one is false to prevent infinite recursion
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
-
- $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
- $("#solver" + childEndtag).append("<br><b>Fieldsplit " + i + " Options (Matrix is <input type=\"checkbox\" id=\"symm" + childEndtag + "\">symmetric, <input type=\"checkbox\" id=\"posdef" + childEndtag + "\">positive definite, <input type=\"checkbox\" id=\"logstruc" + childEndtag + "\">block structured)</b>");
-
- //special for fieldsplit
- if(matInfo[childEndtag].symm)
- $("#symm" + childEndtag).attr("checked",true);
- if(matInfo[childEndtag].posdef)
- $("#posdef" + childEndtag).attr("checked",true);
- if(matInfo[childEndtag].logstruc)
- $("#logstruc" + childEndtag).attr("checked",true);
-
- if(matInfo[endtag].symm)
- $("#symm" + childEndtag).attr("disabled",true);
- if(matInfo[endtag].posdef)
- $("#posdef" + childEndtag).attr("disabled",true);
- if(!matInfo[endtag].symm)
- $("#posdef" + childEndtag).attr("disabled",true);
-
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
- }
- refresh(); //refresh diagrams after any change in pc
-});
-
-//called when a ksp option is changed
-//simply adjust ksp_type in matInfo
-$(document).on("change","select[id^='ksp_type']",function() {
-
- var kspValue = $(this).val();
- var id = $(this).attr("id");//really should not be used in this method. there are better ways of getting information
- var endtag = id.substring(id.indexOf("0"),id.length);
-
- matInfo[endtag].ksp_type = kspValue;
- refresh(); //refresh diagrams after any change in ksp
-});
-
-//need to add a bunch of methods here for changing each variable: pc_fieldsplit_blocks, pc_asm_blocks, pc_redundant_number, etc
-//these methods seem incredibly redundant. perhaps there is a better way to write these.
-$(document).on("change","select[id^='pc_mg_type']",function() {
-
- var mgType = $(this).val();
- var id = $(this).attr("id"); //really should not be used in this method. there are better ways of getting information
- var endtag = id.substring(id.indexOf("0"),id.length);
-
- matInfo[endtag].pc_mg_type = mgType;
- refresh();
-});
-
-$(document).on("change","select[id^='pc_gamg_type']",function() {
-
- var gamgType = $(this).val();
- var id = $(this).attr("id"); //really should not be used in this method. there are better ways of getting information
- var endtag = id.substring(id.indexOf("0"),id.length);
-
- matInfo[endtag].pc_gamg_type = gamgType;
- refresh();
-});
-
-$(document).on("change","select[id^='pc_fieldsplit_type']",function() {
-
- var fieldsplitType = $(this).val();
- var id = $(this).attr("id"); //really should not be used in this method. there are better ways of getting information
- var endtag = id.substring(id.indexOf("0"),id.length);
-
- matInfo[endtag].pc_fieldsplit_type = fieldsplitType;
- refresh();
-});
-
-$(document).on("keyup","input[id^='pc_asm_blocks']",function() {
-
- if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
- return;
-
- var id = this.id;
- var endtag = id.substring(id.indexOf(0),id.length);
- var val = $(this).val();
-
- matInfo[endtag].pc_asm_blocks = val;
- refresh(); //refresh diagrams
-});
-
-$(document).on("keyup","input[id^='pc_asm_overlap']",function() {
-
- if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
- return;
-
- var id = this.id;
- var endtag = id.substring(id.indexOf(0),id.length);
- var val = $(this).val();
-
- matInfo[endtag].pc_asm_overlap = val;
- refresh();
-});
-
-$(document).on("keyup","input[id^='pc_bjacobi_blocks']",function() {
-
- if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
- return;
-
- var id = this.id;
- var endtag = id.substring(id.indexOf(0),id.length);
- var val = $(this).val();
-
- matInfo[endtag].pc_bjacobi_blocks = val;
- refresh(); //refresh diagrams
-});
-
-$(document).on("keyup","input[id^='pc_redundant_number']",function() {
-
- if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
- return;
-
- var id = this.id;
- var endtag = id.substring(id.indexOf(0),id.length);
- var val = $(this).val();
-
- matInfo[endtag].pc_redundant_number = val;
- refresh();
-});
-
-
-//input: endtag of the parent
-function removeAllChildren(endtag) {
-
- var numChildren = getNumChildren(matInfo, endtag);
-
- for(var i=0; i<numChildren; i++) {
- var childEndtag = endtag + "_" + i;
-
- if(getNumChildren(matInfo, childEndtag) > 0)//this child has more children
- {
- removeAllChildren(childEndtag);//recursive call to remove all children of that child
- }
- delete matInfo[childEndtag]; //make sure this location is never accessed again.
-
- $("#solver" + childEndtag).remove();//remove that child itself
- }
-
- //adjust variables in matInfo
- if(matInfo[endtag].pc_type == "mg") {
- matInfo[endtag].pc_mg_levels = 0;
- }
- else if(matInfo[endtag].pc_type == "fieldsplit") {
- matInfo[endtag].pc_fieldsplit_blocks = 0;
- }
-
- $("#pc_type" + endtag).nextAll().remove();//remove the options in the same level solver
-
-}
-
-//called when text input for pc_fieldsplit_blocks is changed
-$(document).on('keyup', "input[id^='pc_fieldsplit_blocks']", function() {
-
- if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
- return;
-
- var id = this.id;
- var endtag = id.substring(id.indexOf(0),id.length);
- var val = $(this).val();
-
- // this next part is a bit tricky...there are 2 cases
-
- //case 1: we need to remove some divs
- if(val < matInfo[endtag].pc_fieldsplit_blocks) {
- for(var i=val; i<matInfo[endtag].pc_fieldsplit_blocks; i++) {
- var childEndtag = endtag + "_" + i;
- removeAllChildren(childEndtag); //remove grandchildren (if any)
- delete matInfo[childEndtag];
- $("#solver" + childEndtag).remove(); //remove the divs
- }
- matInfo[endtag].pc_fieldsplit_blocks = val;
- }
-
- //case 2: we need to add some divs
- else if(val > matInfo[endtag].pc_fieldsplit_blocks) {
-
- var defaults = getDefaults("fieldsplit",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
-
- for(var i = matInfo[endtag].pc_fieldsplit_blocks; i < val; i++) {
-
- //add divs and write matInfo
- var childEndtag = endtag + "_" + i;
- var margin = getNumUnderscores(childEndtag) * 30;
-
- //this is the trickiest part: need to find exactly where to insert the new divs
- //find the first div that doesn't begin with endtag
-
- var currentDiv = $(this).parent().get(0);
-
- while($(currentDiv).next().length > 0) { //while has next
- var nextDiv = $(currentDiv).next().get(0);
- var nextId = nextDiv.id;
- var nextEndtag = nextDiv.id.substring(nextId.indexOf("0"),nextId.length);
-
- if(nextEndtag.indexOf(endtag) == 0) {
- currentDiv = nextDiv;
- }
- else
- break;
- }
-
- //append new stuff immediately after current div
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit!!
- posdef: matInfo[endtag].posdef,
- logstruc: false
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
- $(currentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
- $("#solver" + childEndtag).append("<br><b>Fieldsplit " + i + " Options (Matrix is <input type=\"checkbox\" id=\"symm" + childEndtag + "\">symmetric, <input type=\"checkbox\" id=\"posdef" + childEndtag + "\">positive definite, <input type=\"checkbox\" id=\"logstruc" + childEndtag + "\">block structured)</b>");
-
- //special for fieldsplit
- if(matInfo[childEndtag].symm)
- $("#symm" + childEndtag).attr("checked",true);
- if(matInfo[childEndtag].posdef)
- $("#posdef" + childEndtag).attr("checked",true);
- if(matInfo[childEndtag].logstruc)
- $("#logstruc" + childEndtag).attr("checked",true);
-
- if(matInfo[endtag].symm)
- $("#symm" + childEndtag).attr("disabled",true);
- if(matInfo[endtag].posdef)
- $("#posdef" + childEndtag).attr("disabled",true);
- if(!matInfo[endtag].symm)
- $("#posdef" + childEndtag).attr("disabled",true);
-
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
- matInfo[endtag].pc_fieldsplit_blocks = val;
- }
- refresh(); //refresh diagrams
-});
-
-/*
- This function is called when the text input "MG Levels" is changed
-*/
-$(document).on('keyup', "input[id^='pc_mg_levels']", function()
-{
- if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
- return;
-
- var id = this.id;
- var endtag = id.substring(id.indexOf(0),id.length);
- var val = $(this).val();
-
- // this next part is a bit tricky...there are 2 cases
-
- //case 1: we need to remove some divs
- if(val < matInfo[endtag].pc_mg_levels) {
- for(var i=val; i<matInfo[endtag].pc_mg_levels; i++) {
- var childEndtag = endtag + "_" + i;
- removeAllChildren(childEndtag); //remove grandchildren (if any)
- delete matInfo[childEndtag];
- $("#solver" + childEndtag).remove(); //remove the divs
- }
- matInfo[endtag].pc_mg_levels = val;
- }
-
- //case 2: we need to add some divs
- else if(val > matInfo[endtag].pc_mg_levels) {
-
- var defaults = getDefaults("mg",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
-
- for(var i = matInfo[endtag].pc_mg_levels; i < val; i++) {
- var childEndtag = endtag + "_" + i;
- var margin = getNumUnderscores(childEndtag) * 30;
-
- //this is the trickiest part: need to find exactly where to insert the new divs
- //find the first div that doesn't begin with endtag
-
- var currentDiv = $(this).parent().get(0);
-
- while($(currentDiv).next().length > 0) { //while has next
- var nextDiv = $(currentDiv).next().get(0);
- var nextId = nextDiv.id;
- var nextEndtag = nextDiv.id.substring(nextId.indexOf("0"),nextId.length);
-
- if(nextEndtag.indexOf(endtag) == 0) {
- currentDiv = nextDiv;
- }
- else
- break;
- }
-
- //append new stuff immediately after current div
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit!!
- posdef: matInfo[endtag].posdef,
- logstruc: matInfo[endtag].logstruc
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
- $(currentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
- if(i == 0) //coarse grid solver (level 0)
- $("#solver" + childEndtag).append("<br><b>Coarse Grid Solver (Level 0) </b>");
- else
- $("#solver" + childEndtag).append("<br><b>Smoothing (Level " + i + ") </b>");
-
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
- matInfo[endtag].pc_mg_levels = val;
- }
- refresh(); //refresh diagrams
-});
-
-$(document).on('keyup', "input[id^='pc_gamg_levels']", function()
-{
- if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
- return;
-
- var id = this.id;
- var endtag = id.substring(id.indexOf(0),id.length);
- var val = $(this).val();
-
- // this next part is a bit tricky...there are 2 cases
-
- //case 1: we need to remove some divs
- if(val < matInfo[endtag].pc_gamg_levels) {
- for(var i=val; i<matInfo[endtag].pc_gamg_levels; i++) {
- var childEndtag = endtag + "_" + i;
- removeAllChildren(childEndtag); //remove grandchildren (if any)
- delete matInfo[childEndtag];
- $("#solver" + childEndtag).remove(); //remove the divs
- }
- matInfo[endtag].pc_gamg_levels = val;
- }
-
- //case 2: we need to add some divs
- else if(val > matInfo[endtag].pc_gamg_levels) {
-
- var defaults = getDefaults("gamg",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
-
- for(var i = matInfo[endtag].pc_gamg_levels; i < val; i++) {
- var childEndtag = endtag + "_" + i;
- var margin = getNumUnderscores(childEndtag) * 30;
-
- //this is the trickiest part: need to find exactly where to insert the new divs
- //find the first div that doesn't begin with endtag
-
- var currentDiv = $(this).parent().get(0);
-
- while($(currentDiv).next().length > 0) { //while has next
- var nextDiv = $(currentDiv).next().get(0);
- var nextId = nextDiv.id;
- var nextEndtag = nextDiv.id.substring(nextId.indexOf("0"),nextId.length);
-
- if(nextEndtag.indexOf(endtag) == 0) {
- currentDiv = nextDiv;
- }
- else
- break;
- }
-
- //append new stuff immediately after current div
- matInfo[childEndtag] = {
- pc_type : defaults.sub_pc_type,
- ksp_type: defaults.sub_ksp_type,
- symm: matInfo[endtag].symm, //inherit!!
- posdef: matInfo[endtag].posdef,
- logstruc: matInfo[endtag].logstruc
- };
-
- var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
- $(currentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
- if(i == 0) //coarse grid solver (level 0)
- $("#solver" + childEndtag).append("<br><b>Coarse Grid Solver (Level 0) </b>");
- else
- $("#solver" + childEndtag).append("<br><b>Smoothing (Level " + i + ") </b>");
-
- $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
- $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
-
- populateList("ksp",childEndtag);
- populateList("pc",childEndtag);
-
- //set defaults
- $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
- $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
- //trigger both to add additional options
- $("#ksp_type" + childEndtag).trigger("change");
- $("#pc_type" + childEndtag).trigger("change");
- }
- matInfo[endtag].pc_gamg_levels = val;
- }
- refresh(); //refresh diagrams
-});
+/*
+ This function is called when a pc_type option is changed (new options may need to be displayed and/or old ones removed
+*/
+
+$(document).on("change","select[id^='pc_type']",function() {
+
+ //get the pc option
+ var pcValue = $(this).val();
+ var id = $(this).attr("id"); //really should not be used in this method. there are better ways of getting information
+ var endtag = id.substring(id.indexOf("0"),id.length);
+ var parentDiv = "solver" + endtag;
+
+ removeAllChildren(endtag); //this function also changes matInfo as needed
+
+ //record pc_type in matInfo
+ matInfo[endtag].pc_type = pcValue;
+
+ if (pcValue == "mg") {
+ var defaults = getDefaults("mg",matInfo[endtag].symm, matInfo[endtag].posdef, matInfo[endtag].logstruc);
+ var defaultMgLevels = defaults.pc_mg_levels;
+
+ matInfo[endtag].pc_mg_levels = defaultMgLevels;
+ matInfo[endtag].pc_mg_type = defaults.pc_mg_type;
+
+ //first add options related to multigrid (pc_mg_type and pc_mg_levels)
+ $("#" + parentDiv).append("<br><b>MG Type </b><select id=\"pc_mg_type" + endtag + "\"></select>");
+ $("#" + parentDiv).append("<br><b>MG Levels </b><input type='text' id=\'pc_mg_levels" + endtag + "\' maxlength='4'>");
+
+ populateList("mg",endtag);
+
+ $("#pc_mg_levels" + endtag).val(defaultMgLevels);
+ $("#pc_mg_type" + endtag).val(defaults.pc_mg_type);
+
+ //display options for each level
+ for(var i=defaultMgLevels-1; i>=0; i--) {
+ var childEndtag = endtag + "_" + i;
+
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit !!
+ posdef: matInfo[endtag].posdef,
+ logstruc: matInfo[endtag].logstruc
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+
+ $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+ if(i == 0) //coarse grid solver (level 0)
+ $("#solver" + childEndtag).append("<br><b>Coarse Grid Solver (Level 0) </b>");
+ else
+ $("#solver" + childEndtag).append("<br><b>Smoothing (Level " + i + ") </b>");
+
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+
+ }
+
+ else if(pcValue == "gamg") {
+ var defaults = getDefaults("gamg",matInfo[endtag].symm, matInfo[endtag].posdef, matInfo[endtag].logstruc);
+ var defaultGamgLevels = defaults.pc_gamg_levels;
+
+ matInfo[endtag].pc_gamg_levels = defaultGamgLevels;
+ matInfo[endtag].pc_gamg_type = defaults.pc_gamg_type;
+
+ //first add options related to multigrid (pc_gamg_type and pc_gamg_levels)
+ $("#" + parentDiv).append("<br><b>GAMG Type </b><select id=\"pc_gamg_type" + endtag + "\"></select>");
+ $("#" + parentDiv).append("<br><b>GAMG Levels </b><input type='text' id=\'pc_gamg_levels" + endtag + "\' maxlength='4'>");
+
+ populateList("gamg",endtag);
+
+ $("#pc_gamg_levels" + endtag).val(defaultGamgLevels);
+ $("#pc_gamg_type" + endtag).val(defaults.pc_gamg_type);
+
+ //display options for each level
+ for(var i=defaultGamgLevels-1; i>=0; i--) {
+ var childEndtag = endtag + "_" + i;
+
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit !!
+ posdef: matInfo[endtag].posdef,
+ logstruc: matInfo[endtag].logstruc
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+
+ $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+ if(i == 0) //coarse grid solver (level 0)
+ $("#solver" + childEndtag).append("<br><b>Coarse Grid Solver (Level 0) </b>");
+ else
+ $("#solver" + childEndtag).append("<br><b>Smoothing (Level " + i + ") </b>");
+
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+
+ }
+
+ else if (pcValue == "redundant") {
+ var defaults = getDefaults("redundant",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
+ var defaultRedundantNumber = defaults.pc_redundant_number;
+ var childEndtag = endtag + "_0";
+
+ matInfo[endtag].pc_redundant_number = defaultRedundantNumber;
+
+ //first add options related to redundant (pc_redundant_number)
+ $("#" + parentDiv).append("<br><b>Redundant Number </b><input type='text' id=\'pc_redundant_number" + endtag + "\' maxlength='4'>");
+ $("#pc_redundant_number" + endtag).val(defaultRedundantNumber);
+
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit!!
+ posdef: matInfo[endtag].posdef,
+ logstruc: matInfo[endtag].logstruc
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+ $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+ $("#solver" + childEndtag).append("<br><b>Redundant Solver Options </b>");
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+
+ else if (pcValue == "bjacobi") {
+ var defaults = getDefaults("bjacobi",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
+ var defaultBjacobiBlocks = defaults.pc_bjacobi_blocks;
+ var childEndtag = endtag + "_0";
+
+ matInfo[endtag].pc_bjacobi_blocks = defaultBjacobiBlocks;
+
+ //first add options related to bjacobi (pc_bjacobi_blocks)
+ $("#" + parentDiv).append("<br><b>Bjacobi Blocks </b><input type='text' id=\'pc_bjacobi_blocks" + endtag + "\' maxlength='4'>");
+ $("#pc_bjacobi_blocks" + endtag).val(defaultBjacobiBlocks);
+
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit!!
+ posdef: matInfo[endtag].posdef,
+ logstruc: matInfo[endtag].logstruc
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+
+ $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+
+ $("#solver" + childEndtag).append("<br><b>Bjacobi Solver Options </b>");
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+
+ else if (pcValue == "asm") {
+ var defaults = getDefaults("asm",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
+
+ var defaultAsmBlocks = defaults.pc_asm_blocks;
+ var defaultAsmOverlap = defaults.pc_asm_overlap;
+ var childEndtag = endtag + "_0";
+
+ matInfo[endtag].pc_asm_blocks = defaultAsmBlocks;
+ matInfo[endtag].pc_asm_overlap = defaultAsmOverlap;
+
+ //first add options related to ASM
+ $("#" + parentDiv).append("<br><b>ASM blocks </b><input type='text' id=\"pc_asm_blocks" + endtag + "\" maxlength='4'>");
+ $("#" + parentDiv).append("<br><b>ASM overlap </b><input type='text' id=\"pc_asm_overlap" + endtag + "\" maxlength='4'>");
+ $("#pc_asm_blocks" + endtag).val(defaultAsmBlocks);
+ $("#pc_asm_overlap" + endtag).val(defaultAsmOverlap);
+
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit!!
+ posdef: matInfo[endtag].posdef,
+ logstruc: matInfo[endtag].logstruc
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+
+ $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+
+ $("#solver" + childEndtag).append("<br><b>ASM Solver Options </b>");
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+
+ else if (pcValue == "ksp") {
+ var defaults = getDefaults("ksp",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
+ var childEndtag = endtag + "_0";
+
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit!!
+ posdef: matInfo[endtag].posdef,
+ logstruc: matInfo[endtag].logstruc
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+
+ $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+
+ $("#solver" + childEndtag).append("<br><b>KSP Solver Options </b>");
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+
+ else if (pcValue == "fieldsplit") {
+ /*if(!matInfo[endtag].logstruc) {//do nothing if not logstruc
+ alert("Error: Fieldsplit can only be used on logically block-structured matrix!");
+ return;
+ }*/
+ var defaults = getDefaults("fieldsplit",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
+ var defaultFieldsplitBlocks = defaults.pc_fieldsplit_blocks;
+
+ matInfo[endtag].pc_fieldsplit_type = defaults.pc_fieldsplit_type;
+ matInfo[endtag].pc_fieldsplit_blocks = defaults.pc_fieldsplit_blocks;
+
+ //first add options related to fieldsplit (pc_fieldsplit_type and pc_fieldsplit_blocks)
+ $("#" + parentDiv).append("<br><b>Fieldsplit Type </b><select id=\"pc_fieldsplit_type" + endtag + "\"></select>");
+ $("#" + parentDiv).append("<br><b>Fieldsplit Blocks </b><input type='text' id=\"pc_fieldsplit_blocks" + endtag + "\" maxlength='4'>");
+
+ populateList("fieldsplit",endtag);
+
+ $("#pc_fieldsplit_blocks" + endtag).val(defaultFieldsplitBlocks);
+ $("#pc_fieldsplit_type" + endtag).val(defaults.pc_fieldsplit_type);
+
+ for(var i=defaultFieldsplitBlocks-1; i>=0; i--) {
+ var childEndtag = endtag + "_" + i;
+
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit!!
+ posdef: matInfo[endtag].posdef,
+ logstruc: false //this one is false to prevent infinite recursion
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+
+ $("#" + parentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+ $("#solver" + childEndtag).append("<br><b>Fieldsplit " + i + " Options (Matrix is <input type=\"checkbox\" id=\"symm" + childEndtag + "\">symmetric, <input type=\"checkbox\" id=\"posdef" + childEndtag + "\">positive definite, <input type=\"checkbox\" id=\"logstruc" + childEndtag + "\">block structured)</b>");
+
+ //special for fieldsplit
+ if(matInfo[childEndtag].symm)
+ $("#symm" + childEndtag).attr("checked",true);
+ if(matInfo[childEndtag].posdef)
+ $("#posdef" + childEndtag).attr("checked",true);
+ if(matInfo[childEndtag].logstruc)
+ $("#logstruc" + childEndtag).attr("checked",true);
+
+ if(matInfo[endtag].symm)
+ $("#symm" + childEndtag).attr("disabled",true);
+ if(matInfo[endtag].posdef)
+ $("#posdef" + childEndtag).attr("disabled",true);
+ if(!matInfo[endtag].symm)
+ $("#posdef" + childEndtag).attr("disabled",true);
+
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+ }
+ refresh(); //refresh diagrams after any change in pc
+});
+
+//called when a ksp option is changed
+//simply adjust ksp_type in matInfo
+$(document).on("change","select[id^='ksp_type']",function() {
+
+ var kspValue = $(this).val();
+ var id = $(this).attr("id");//really should not be used in this method. there are better ways of getting information
+ var endtag = id.substring(id.indexOf("0"),id.length);
+
+ matInfo[endtag].ksp_type = kspValue;
+ refresh(); //refresh diagrams after any change in ksp
+});
+
+//need to add a bunch of methods here for changing each variable: pc_fieldsplit_blocks, pc_asm_blocks, pc_redundant_number, etc
+//these methods seem incredibly redundant. perhaps there is a better way to write these.
+$(document).on("change","select[id^='pc_mg_type']",function() {
+
+ var mgType = $(this).val();
+ var id = $(this).attr("id"); //really should not be used in this method. there are better ways of getting information
+ var endtag = id.substring(id.indexOf("0"),id.length);
+
+ matInfo[endtag].pc_mg_type = mgType;
+ refresh();
+});
+
+$(document).on("change","select[id^='pc_gamg_type']",function() {
+
+ var gamgType = $(this).val();
+ var id = $(this).attr("id"); //really should not be used in this method. there are better ways of getting information
+ var endtag = id.substring(id.indexOf("0"),id.length);
+
+ matInfo[endtag].pc_gamg_type = gamgType;
+ refresh();
+});
+
+$(document).on("change","select[id^='pc_fieldsplit_type']",function() {
+
+ var fieldsplitType = $(this).val();
+ var id = $(this).attr("id"); //really should not be used in this method. there are better ways of getting information
+ var endtag = id.substring(id.indexOf("0"),id.length);
+
+ matInfo[endtag].pc_fieldsplit_type = fieldsplitType;
+ refresh();
+});
+
+$(document).on("keyup","input[id^='pc_asm_blocks']",function() {
+
+ if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
+ return;
+
+ var id = this.id;
+ var endtag = id.substring(id.indexOf(0),id.length);
+ var val = $(this).val();
+
+ matInfo[endtag].pc_asm_blocks = val;
+ refresh(); //refresh diagrams
+});
+
+$(document).on("keyup","input[id^='pc_asm_overlap']",function() {
+
+ if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
+ return;
+
+ var id = this.id;
+ var endtag = id.substring(id.indexOf(0),id.length);
+ var val = $(this).val();
+
+ matInfo[endtag].pc_asm_overlap = val;
+ refresh();
+});
+
+$(document).on("keyup","input[id^='pc_bjacobi_blocks']",function() {
+
+ if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
+ return;
+
+ var id = this.id;
+ var endtag = id.substring(id.indexOf(0),id.length);
+ var val = $(this).val();
+
+ matInfo[endtag].pc_bjacobi_blocks = val;
+ refresh(); //refresh diagrams
+});
+
+$(document).on("keyup","input[id^='pc_redundant_number']",function() {
+
+ if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
+ return;
+
+ var id = this.id;
+ var endtag = id.substring(id.indexOf(0),id.length);
+ var val = $(this).val();
+
+ matInfo[endtag].pc_redundant_number = val;
+ refresh();
+});
+
+
+//input: endtag of the parent
+function removeAllChildren(endtag) {
+
+ var numChildren = getNumChildren(matInfo, endtag);
+
+ for(var i=0; i<numChildren; i++) {
+ var childEndtag = endtag + "_" + i;
+
+ if(getNumChildren(matInfo, childEndtag) > 0)//this child has more children
+ {
+ removeAllChildren(childEndtag);//recursive call to remove all children of that child
+ }
+ delete matInfo[childEndtag]; //make sure this location is never accessed again.
+
+ $("#solver" + childEndtag).remove();//remove that child itself
+ }
+
+ //adjust variables in matInfo
+ if(matInfo[endtag].pc_type == "mg") {
+ matInfo[endtag].pc_mg_levels = 0;
+ }
+ else if(matInfo[endtag].pc_type == "fieldsplit") {
+ matInfo[endtag].pc_fieldsplit_blocks = 0;
+ }
+
+ $("#pc_type" + endtag).nextAll().remove();//remove the options in the same level solver
+
+}
+
+//called when text input for pc_fieldsplit_blocks is changed
+$(document).on('keyup', "input[id^='pc_fieldsplit_blocks']", function() {
+
+ if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
+ return;
+
+ var id = this.id;
+ var endtag = id.substring(id.indexOf(0),id.length);
+ var val = $(this).val();
+
+ // this next part is a bit tricky...there are 2 cases
+
+ //case 1: we need to remove some divs
+ if(val < matInfo[endtag].pc_fieldsplit_blocks) {
+ for(var i=val; i<matInfo[endtag].pc_fieldsplit_blocks; i++) {
+ var childEndtag = endtag + "_" + i;
+ removeAllChildren(childEndtag); //remove grandchildren (if any)
+ delete matInfo[childEndtag];
+ $("#solver" + childEndtag).remove(); //remove the divs
+ }
+ matInfo[endtag].pc_fieldsplit_blocks = val;
+ }
+
+ //case 2: we need to add some divs
+ else if(val > matInfo[endtag].pc_fieldsplit_blocks) {
+
+ var defaults = getDefaults("fieldsplit",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
+
+ for(var i = matInfo[endtag].pc_fieldsplit_blocks; i < val; i++) {
+
+ //add divs and write matInfo
+ var childEndtag = endtag + "_" + i;
+ var margin = getNumUnderscores(childEndtag) * 30;
+
+ //this is the trickiest part: need to find exactly where to insert the new divs
+ //find the first div that doesn't begin with endtag
+
+ var currentDiv = $(this).parent().get(0);
+
+ while($(currentDiv).next().length > 0) { //while has next
+ var nextDiv = $(currentDiv).next().get(0);
+ var nextId = nextDiv.id;
+ var nextEndtag = nextDiv.id.substring(nextId.indexOf("0"),nextId.length);
+
+ if(nextEndtag.indexOf(endtag) == 0) {
+ currentDiv = nextDiv;
+ }
+ else
+ break;
+ }
+
+ //append new stuff immediately after current div
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit!!
+ posdef: matInfo[endtag].posdef,
+ logstruc: false
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+ $(currentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+ $("#solver" + childEndtag).append("<br><b>Fieldsplit " + i + " Options (Matrix is <input type=\"checkbox\" id=\"symm" + childEndtag + "\">symmetric, <input type=\"checkbox\" id=\"posdef" + childEndtag + "\">positive definite, <input type=\"checkbox\" id=\"logstruc" + childEndtag + "\">block structured)</b>");
+
+ //special for fieldsplit
+ if(matInfo[childEndtag].symm)
+ $("#symm" + childEndtag).attr("checked",true);
+ if(matInfo[childEndtag].posdef)
+ $("#posdef" + childEndtag).attr("checked",true);
+ if(matInfo[childEndtag].logstruc)
+ $("#logstruc" + childEndtag).attr("checked",true);
+
+ if(matInfo[endtag].symm)
+ $("#symm" + childEndtag).attr("disabled",true);
+ if(matInfo[endtag].posdef)
+ $("#posdef" + childEndtag).attr("disabled",true);
+ if(!matInfo[endtag].symm)
+ $("#posdef" + childEndtag).attr("disabled",true);
+
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+ matInfo[endtag].pc_fieldsplit_blocks = val;
+ }
+ refresh(); //refresh diagrams
+});
+
+/*
+ This function is called when the text input "MG Levels" is changed
+*/
+$(document).on('keyup', "input[id^='pc_mg_levels']", function()
+{
+ if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
+ return;
+
+ var id = this.id;
+ var endtag = id.substring(id.indexOf(0),id.length);
+ var val = $(this).val();
+
+ // this next part is a bit tricky...there are 2 cases
+
+ //case 1: we need to remove some divs
+ if(val < matInfo[endtag].pc_mg_levels) {
+ for(var i=val; i<matInfo[endtag].pc_mg_levels; i++) {
+ var childEndtag = endtag + "_" + i;
+ removeAllChildren(childEndtag); //remove grandchildren (if any)
+ delete matInfo[childEndtag];
+ $("#solver" + childEndtag).remove(); //remove the divs
+ }
+ matInfo[endtag].pc_mg_levels = val;
+ }
+
+ //case 2: we need to add some divs
+ else if(val > matInfo[endtag].pc_mg_levels) {
+
+ var defaults = getDefaults("mg",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
+
+ for(var i = matInfo[endtag].pc_mg_levels; i < val; i++) {
+ var childEndtag = endtag + "_" + i;
+ var margin = getNumUnderscores(childEndtag) * 30;
+
+ //this is the trickiest part: need to find exactly where to insert the new divs
+ //find the first div that doesn't begin with endtag
+
+ var currentDiv = $(this).parent().get(0);
+
+ while($(currentDiv).next().length > 0) { //while has next
+ var nextDiv = $(currentDiv).next().get(0);
+ var nextId = nextDiv.id;
+ var nextEndtag = nextDiv.id.substring(nextId.indexOf("0"),nextId.length);
+
+ if(nextEndtag.indexOf(endtag) == 0) {
+ currentDiv = nextDiv;
+ }
+ else
+ break;
+ }
+
+ //append new stuff immediately after current div
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit!!
+ posdef: matInfo[endtag].posdef,
+ logstruc: matInfo[endtag].logstruc
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+ $(currentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+ if(i == 0) //coarse grid solver (level 0)
+ $("#solver" + childEndtag).append("<br><b>Coarse Grid Solver (Level 0) </b>");
+ else
+ $("#solver" + childEndtag).append("<br><b>Smoothing (Level " + i + ") </b>");
+
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+ matInfo[endtag].pc_mg_levels = val;
+ }
+ refresh(); //refresh diagrams
+});
+
+$(document).on('keyup', "input[id^='pc_gamg_levels']", function()
+{
+ if($(this).val().match(/[^0-9]/) || $(this).val()<1) //return on invalid input
+ return;
+
+ var id = this.id;
+ var endtag = id.substring(id.indexOf(0),id.length);
+ var val = $(this).val();
+
+ // this next part is a bit tricky...there are 2 cases
+
+ //case 1: we need to remove some divs
+ if(val < matInfo[endtag].pc_gamg_levels) {
+ for(var i=val; i<matInfo[endtag].pc_gamg_levels; i++) {
+ var childEndtag = endtag + "_" + i;
+ removeAllChildren(childEndtag); //remove grandchildren (if any)
+ delete matInfo[childEndtag];
+ $("#solver" + childEndtag).remove(); //remove the divs
+ }
+ matInfo[endtag].pc_gamg_levels = val;
+ }
+
+ //case 2: we need to add some divs
+ else if(val > matInfo[endtag].pc_gamg_levels) {
+
+ var defaults = getDefaults("gamg",matInfo[endtag].symm,matInfo[endtag].posdef,matInfo[endtag].logstruc);
+
+ for(var i = matInfo[endtag].pc_gamg_levels; i < val; i++) {
+ var childEndtag = endtag + "_" + i;
+ var margin = getNumUnderscores(childEndtag) * 30;
+
+ //this is the trickiest part: need to find exactly where to insert the new divs
+ //find the first div that doesn't begin with endtag
+
+ var currentDiv = $(this).parent().get(0);
+
+ while($(currentDiv).next().length > 0) { //while has next
+ var nextDiv = $(currentDiv).next().get(0);
+ var nextId = nextDiv.id;
+ var nextEndtag = nextDiv.id.substring(nextId.indexOf("0"),nextId.length);
+
+ if(nextEndtag.indexOf(endtag) == 0) {
+ currentDiv = nextDiv;
+ }
+ else
+ break;
+ }
+
+ //append new stuff immediately after current div
+ matInfo[childEndtag] = {
+ pc_type : defaults.sub_pc_type,
+ ksp_type: defaults.sub_ksp_type,
+ symm: matInfo[endtag].symm, //inherit!!
+ posdef: matInfo[endtag].posdef,
+ logstruc: matInfo[endtag].logstruc
+ };
+
+ var margin = 30 * getNumUnderscores(childEndtag); //indent based on the level of the solver (number of underscores)
+ $(currentDiv).after("<div id=\"solver" + childEndtag + "\" style=\"margin-left:" + margin + "px;\"></div>");
+ if(i == 0) //coarse grid solver (level 0)
+ $("#solver" + childEndtag).append("<br><b>Coarse Grid Solver (Level 0) </b>");
+ else
+ $("#solver" + childEndtag).append("<br><b>Smoothing (Level " + i + ") </b>");
+
+ $("#solver" + childEndtag).append("<br><b>KSP </b><select id=\"ksp_type" + childEndtag + "\"></select>");
+ $("#solver" + childEndtag).append("<br><b>PC </b><select id=\"pc_type" + childEndtag + "\"></select>");
+
+ populateList("ksp",childEndtag);
+ populateList("pc",childEndtag);
+
+ //set defaults
+ $("#ksp_type" + childEndtag).val(defaults.sub_ksp_type);
+ $("#pc_type" + childEndtag).val(defaults.sub_pc_type);
+ //trigger both to add additional options
+ $("#ksp_type" + childEndtag).trigger("change");
+ $("#pc_type" + childEndtag).trigger("change");
+ }
+ matInfo[endtag].pc_gamg_levels = val;
+ }
+ refresh(); //refresh diagrams
+});
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/petsc.git
More information about the debian-science-commits
mailing list