使用Mesh2D构造函数重新创建fipy Grid2D

时间:2019-04-24 15:19:01

标签: fipy

如果我使用以下方式创建fipy 2D网格:

function openQRCamera(node) {
  var reader = new FileReader();

  reader.onload = function() {
    node.value = "";
    qrcode.callback = function(res) {
      if(res instanceof Error) {
        alert("No QR code found. Please make sure the QR code is within the camera's frame and try again.");
      } else {
        node.parentNode.previousElementSibling.value = res;
      }
    };
    qrcode.decode(reader.result);
  };

  reader.readAsDataURL(node.files[0]);

  document.getElementById("showMe").style.display="block";

   myLog();
}

function myLog(){
  Vcard0 = document.getElementById("iCard").value;
  //test vcard scan variable set
  console.log(Vcard0);

  //remove beginning and end vcard
  Vcard0 = Vcard0.replace('BEGIN:VCARDVERSION:2.1',"");
  Vcard0 = Vcard0.replace('END:VCARD',"");

  //insert colons for splitting pairs
  Vcard0 = Vcard0.replace('FN:',':Fn:');
  Vcard0 = Vcard0.replace('N:',':N:');
  Vcard0 = Vcard0.replace('ORG:',':ORG:');
  Vcard0 = Vcard0.replace('TITLE:',':TITLE:');
  Vcard0 = Vcard0.replace('TEL;WORK;VOICE:',':TEL:');
  Vcard0 = Vcard0.replace('EMAIL;WORK;INTERNET:',':EMAIL:');

  //add colons to prepare qrcode for split function
    var Vcard1 = Vcard0.replace(/(\r\n|\n|\r)/gm,":");
    Vcard1 = Vcard1.replace('::',':');
    var qrArray = Vcard1.split(":");
    var qrArrayJSON = JSON.stringify(qrArray);

  //test array pairs
  for(i=0;i<qrArray.length;i++)
{
   console.log(qrArray[i]);
}
  console.log(qrArrayJSON);

  //search for titles and set variable to next element (value is the next field)

    Fn = qrArray[(qrArray.indexOf("Fn"))+1];
    N = qrArray[(qrArray.indexOf("N"))+1];
    ORG = qrArray[(qrArray.indexOf("ORG"))+1];
    TITLE = qrArray[(qrArray.indexOf("TITLE"))+1];
    TEL = qrArray[(qrArray.indexOf("TEL"))+1];
    EMAIL = qrArray[(qrArray.indexOf("EMAIL"))+1];

  //check for null
    if (Fn === null || Fn === " ")
            {Fn = "";}
    if (N === null || N === " ")
            {N = "";}
    if (ORG === null || ORG === " ")
            {ORG = "";}
    if (TITLE === null || TITLE === " ")
            {TITLE = "";}
    if (TEL === null || TEL === " ")
            {TEL = "";}
    if (EMAIL === null || EMAIL === " ")
            {EMAIL = "";}

  //test variables
  console.log(Fn);
  console.log(N);
  console.log(ORG);
  console.log(TITLE);
  console.log(TEL);
  console.log(EMAIL);

  //set text inputs to variables
  document.getElementById("hideMe").style.display = "none";
  document.getElementById("iFN").value=Fn;
  document.getElementById("iORG").value=ORG;
  document.getElementById("iTITLE").value=TITLE;
  document.getElementById("iTEL").value=TEL;
  document.getElementById("iEMAIL").value=EMAIL;
  document.getElementById("iNOTES").value=NOTES;

}

我得到了一个合理的矩形元素网格。但是,如果我采用此网格的值并用它们来构造香草mesh = Grid2D(nx=3, ny=3, dx=1., dy=1.)

Mesh2D

我得到一个三角形的网格,并且某些三角形似乎无效。如果我这样做:

mesh2d = Mesh2D(mesh.vertexCoords, mesh.faceVertexIDs, mesh.cellFaceIDs)

并使用matplotlib查看器查看它,一些三角形没有填充,我认为这是无效的。

我可以使用model = CellVariable(mesh=mesh2d, value=1.) 重新创建原始的矩形网格吗?我想这样做,是因为在调用Mesh2D时我想替代mesh.vectorCoords的另一个来源使矩形网格坐标变形。面的顶点和单元的面是相同的,只是网状织物变形了。

2 个答案:

答案 0 :(得分:1)

我认为查看器无法显示Mesh2D网格类,而不能显示任何使用Mesh2D对象求解方程式的根本错误的东西。为了证明这一点,您可以使用Mesh2D解决一个简单的方程式,然后映射回Grid2D以显示您的数据。例如,

import fipy

mesh = fipy.Grid2D(nx=3, ny=3, dx=1., dy=1.)
mesh2d = fipy.meshes.mesh2D.Mesh2D(mesh.vertexCoords, mesh.faceVertexIDs, mesh.cellFaceIDs)

var = fipy.CellVariable(mesh=mesh, value=1.)
var2D = fipy.CellVariable(mesh=mesh2d, value=1.)

var2D.constrain(2, where=mesh.facesRight)
var2D.constrain(0, where=mesh.facesLeft)

fipy.DiffusionTerm().solve(var2D)


var[:] = var2D(mesh.cellCenters, order=1)

fipy.Viewer(var).plot()
raw_input('stop')

,结果看起来正确。我们已经在Mesh2D上使用变量解决了一个方程式,它似乎运行得很好。

上面是使用__call__的{​​{1}}方法来插值回到CellVariable上的变量的。这种方法也适用于变形的网格。插值仅是一阶。

答案 1 :(得分:1)

export default class LoginScreen extends Component { render() { return ( <Wallpaper> </Wallpaper> ); } } 有许多优化方案,它们在求解和查看方面都是自洽的,但不会转化为一般的网格。您可以通过

来实现所需的目标
Grid2D