int copyFile(const char *srcPath, const char *destPath) { BFilePtr sFp(srcPath, "rb"); BFilePtr dFp(destPath, "wb"); int c; if (sFp == nullptr || dFp == nullptr) { return 0; } while ((c = fgetc(sFp)) != EOF) { fputc(c, dFp); } return 1; }
const Vector & PFEMElement2DBubble::getResistingForceSensitivity(int gradnumber) { // resize P int ndf = this->getNumDOF(); P.resize(ndf); P.Zero(); Vector dF(6), dFp(3), vdot(6), v(6), p(3), du(6); for(int i=0; i<3; i++) { const Vector& accel = nodes[2*i]->getTrialAccel(); vdot(2*i) = accel(0); vdot(2*i+1) = accel(1); const Vector& vel = nodes[2*i]->getTrialVel(); v(2*i) = vel(0); v(2*i+1) = vel(1); const Vector& vel2 = nodes[2*i+1]->getTrialVel(); // pressure p(i) = vel2(0); du(2*i) = nodes[2*i]->getDispSensitivity(1,gradnumber); du(2*i+1) = nodes[2*i]->getDispSensitivity(2,gradnumber); } // consditional sensitivity getdF(dF); double dm = getdM(); dF.addVector(-1.0, vdot, dm); getdFp(dFp); Matrix dl; getdL(dl); dFp.addMatrixVector(-1.0, dl, p, 1.0); // geometric sensitivity Matrix dM, dg, df; getdM(vdot, dM); getdG(p, dg); getdF(df); dF.addMatrixVector(1.0, dM, du, 1.0); dF.addMatrixVector(1.0, dg, du, -1.0); dF.addMatrixVector(1.0, df, du, -1.0); Matrix dgt, dL, dfp; getdGt(v, dgt); getdL(p, dL); getdFp(dfp); dFp.addMatrixVector(1.0, dgt, du, 1.0); dFp.addMatrixVector(1.0, dL, du, 1.0); dFp.addMatrixVector(1.0, dfp, du, -1.0); // copy for(int i=0; i<3; i++) { P(numDOFs(2*i)) += dF(2*i); P(numDOFs(2*i)+1) += dF(2*i+1); P(numDOFs(2*i+1)) += dFp(i); } return P; }