void PrescribedGradientBCWeak :: computeIntForceGPContrib(FloatArray &oContrib_disp, IntArray &oDisp_loc_array, FloatArray &oContrib_trac, IntArray &oTrac_loc_array,TracSegArray &iEl, GaussPoint &iGP, int iDim, TimeStep *tStep, const FloatArray &iBndCoord, const double &iScaleFac, ValueModeType mode, CharType type, const UnknownNumberingScheme &s) { SpatialLocalizer *localizer = domain->giveSpatialLocalizer(); FloatMatrix contrib; assembleTangentGPContributionNew(contrib, iEl, iGP, iScaleFac, iBndCoord); // Compute vector of traction unknowns FloatArray tracUnknowns; iEl.mFirstNode->giveUnknownVector(tracUnknowns, giveTracDofIDs(), mode, tStep); iEl.giveTractionLocationArray(oTrac_loc_array, type, s); FloatArray dispElLocCoord, closestPoint; Element *dispEl = localizer->giveElementClosestToPoint(dispElLocCoord, closestPoint, iBndCoord ); // Compute vector of displacement unknowns FloatArray dispUnknowns; int numDMan = dispEl->giveNumberOfDofManagers(); for(int i = 1; i <= numDMan; i++) { FloatArray nodeUnknowns; DofManager *dMan = dispEl->giveDofManager(i); IntArray dispIDs = giveRegularDispDofIDs(); if(domain->hasXfemManager()) { XfemManager *xMan = domain->giveXfemManager(); dispIDs.followedBy(xMan->giveEnrichedDofIDs(*dMan)); } dMan->giveUnknownVector(nodeUnknowns, dispIDs,mode, tStep); dispUnknowns.append(nodeUnknowns); } dispEl->giveLocationArray(oDisp_loc_array, s); oContrib_disp.beTProductOf(contrib, tracUnknowns); oContrib_disp.negated(); oContrib_trac.beProductOf(contrib, dispUnknowns); oContrib_trac.negated(); }
void LEPlic :: doLagrangianPhase(TimeStep *atTime) { //Maps element nodes along trajectories using basic Runge-Kutta method (midpoint rule) int i, ci, ndofman = domain->giveNumberOfDofManagers(); int nsd = 2; double dt = atTime->giveTimeIncrement(); DofManager *dman; Node *inode; IntArray velocityMask; FloatArray x, x2(nsd), v_t, v_tn1; FloatMatrix t; #if 1 EngngModel *emodel = domain->giveEngngModel(); int err; #endif velocityMask.setValues(2, V_u, V_v); updated_XCoords.resize(ndofman); updated_YCoords.resize(ndofman); for ( i = 1; i <= ndofman; i++ ) { dman = domain->giveDofManager(i); // skip dofmanagers with no position information if ( ( dman->giveClassID() != NodeClass ) && ( dman->giveClassID() != RigidArmNodeClass ) && ( dman->giveClassID() != HangingNodeClass ) ) { continue; } inode = ( Node * ) dman; // get node coordinates x = * ( inode->giveCoordinates() ); // get velocity field v(tn, x(tn)) for dof manager #if 1 /* Original version */ dman->giveUnknownVector( v_t, velocityMask, EID_MomentumBalance, VM_Total, atTime->givePreviousStep() ); /* Modified version */ //dman->giveUnknownVector(v_t, velocityMask, EID_MomentumBalance, VM_Total, atTime); // Original version // compute updated position x(tn)+0.5*dt*v(tn,x(tn)) for ( ci = 1; ci <= nsd; ci++ ) { x2.at(ci) = x.at(ci) + 0.5 *dt *v_t.at(ci); } // compute interpolated velocity field at x2 [ v(tn+1, x(tn)+0.5*dt*v(tn,x(tn))) = v(tn+1, x2) ] Field *vfield; vfield = emodel->giveContext()->giveFieldManager()->giveField(FT_Velocity); if ( vfield == NULL ) { _error("doLagrangianPhase: Velocity field not available"); } err = vfield->evaluateAt(v_tn1, x2, VM_Total, atTime); if ( err == 1 ) { // point outside domain -> be explicit v_tn1 = v_t; } else if ( err != 0 ) { _error2("doLagrangianPhase: vfield->evaluateAt failed, error code %d", err); } // compute final updated position for ( ci = 1; ci <= nsd; ci++ ) { x2.at(ci) = x.at(ci) + dt *v_tn1.at(ci); } #else // pure explicit version dman->giveUnknownVector(v_t, velocityMask, EID_MomentumBalance, VM_Total, atTime); for ( ci = 1; ci <= nsd; ci++ ) { x2.at(ci) = x.at(ci) + dt *v_t.at(ci); } #endif // store updated node position updated_XCoords.at(i) = x2.at(1); updated_YCoords.at(i) = x2.at(2); } }