def DDG_uv(U, V, dV): u = U[0] v = U[1] u_ = V[0] v_ = V[1] du = dV[0] dv = dV[1] em = emin(u, v) eM = emax(u, v) abs_u = pow((pow(u[0], 2) + pow(u[1], 2)), 1 / 2) martEnergy_uu = -3. / 2. * (1. / 3. * v / abs_u - 1. / 2.) * inner(u_, du) stiffEnergy_uu = -3./2.*(1./3.*v/abs_u - 1./2.)*inner(u_, du) \ + 1./2.*((v/abs_u + 1./2.))*inner(du, u_) martEnergy_vv = 1. / 3. * dv * v_ stiffEnergy_vv = 1. / 3. * dv * v_ + dv * v_ isLiquid = And(And(gt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2)) isMartensite = And(And(lt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2 + 1 / 2)) isStiff = conditional( And(And(lt(em, -1 / 3), gt(eM, -em / 2.)), lt(eM, -em / 2 + 1 / 2)), stiffEnergy_uu + stiffEnergy_vv, 0) isSolid = conditional(isMartensite, martEnergy_uu + martEnergy_vv, isStiff) eff_density_uv = conditional(isLiquid, 0., isSolid) return eff_density_uv * dx
def DG_uv(U, V): u = U[0] v = U[1] u_ = V[0] v_ = V[1] em = emin(u, v) eM = emax(u, v) abs_u = pow((pow(u[0], 2) + pow(u[1], 2)), 1 / 2) martEnergy_u = 3. / 2. * (em - 1. / 3.) * 2 * (-1. / 2.) * inner( u, u_) / abs_u stiffEnergy_u = 3./2.*(em - 1./3.)*2*(-1./2.)*inner(u, u_)/abs_u \ + (em + 2.*eM-1)*inner(u, u_)/abs_u martEnergy_v = 3. / 2. * (em - 1. / 3.) * 2 * 1. / 3. * v_ stiffEnergy_v = 3./2.*(em - 1./3.)*2*1./3.*v_ \ + (em + 2.*eM-1)*v_ isLiquid = And(And(gt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2)) isMartensite = And(And(lt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2 + 1 / 2)) isStiff = conditional( And(And(lt(em, -1 / 3), gt(eM, -em / 2.)), lt(eM, -em / 2 + 1 / 2)), stiffEnergy_u + stiffEnergy_v, 0) isSolid = conditional(isMartensite, martEnergy_u + martEnergy_v, isStiff) eff_density_uv = conditional(isLiquid, 0., isSolid) return eff_density_uv * dx
def G(U): v = U[1] stiffEnergy = 1 / 2 * 2. / 3. * pow((v - 1.), 2.) martEnergy = 1 / 2 * 2. / 3. * pow((v + 1. / 2.), 2.) # isLiquid = And(And(gt(em, -1/3), lt(eM,-2.*em)), gt(eM, - em/2.)) isLiquid = And(gt(v, -1 / 2), lt(v, 1.)) isElastic = gt(v, 1.) isMartensite = lt(v, -1. / 2.) isSolid = conditional(isMartensite, martEnergy, stiffEnergy) eff_density = conditional(isLiquid, 0., isSolid) return eff_density * dx
def DDG_uv(U, V, dV): v = U[1] v_ = V[1] dv = dV[1] stiffEnergy = 2. / 3. * dv * v_ martEnergy = 2. / 3. * dv * v_ # isLiquid = And(And(gt(em, -1/3), lt(eM,-2.*em)), gt(eM, - em/2.)) isLiquid = And(gt(v, -1 / 2), lt(v, 1.)) isElastic = gt(v, 1.) isMartensite = lt(v, -1. / 2.) isSolid = conditional(isMartensite, martEnergy, stiffEnergy) eff_density = conditional(isLiquid, 0., isSolid) return eff_density * dx
def DG_uv(U, V): v = U[1] v_ = V[1] # em = emin(u, v) # eM = emax(u, v) stiffEnergy = 2. / 3. * (v - 1.) * v_ martEnergy = 2. / 3. * (v + 1. / 2.) * v_ # isLiquid = And(And(gt(em, -1/3), lt(eM,-2.*em)), gt(eM, - em/2.)) isLiquid = And(gt(v, -1 / 2), lt(v, 1.)) isElastic = gt(v, 1.) isMartensite = lt(v, -1. / 2.) isSolid = conditional(isMartensite, martEnergy, stiffEnergy) eff_density = conditional(isLiquid, 0., isSolid) return eff_density * dx
def phase(u, v): # phase of dofs em = emin(u, v) eM = emax(u, v) isLiquid = And(And(gt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2)) isMartensite = And(And(lt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2 + 1 / 2)) isStiff = conditional( And(And(lt(em, -1 / 3), gt(eM, -em / 2.)), lt(eM, -em / 2 + 1 / 2)), 3, -1) isSolid = conditional(isMartensite, 2, isStiff) # phase = conditional(isLiquid, 1, isSolid) phase = conditional(isLiquid, 1, 0) return phase
def H(v): em = v / 6. eM = conditional(gt(-v, 0), -v / 3., +v / 6.) martEnergy = 3. / 2. * pow((em - 1. / 3.), 2.) stiffEnergy = 3. / 2. * pow((em - 1. / 3.), 2.) + 1. / 2. * pow( (em + 2. * eM - 1.), 2.) isLiquid = And(And(gt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2)) isMartensite = And(And(lt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2 + 1 / 2)) isStiff = conditional( And(And(lt(em, -1 / 3), gt(eM, -em / 2.)), lt(eM, -em / 2 + 1 / 2)), stiffEnergy, 0) isSolid = conditional(isMartensite, martEnergy, isStiff) eff_density = conditional(isLiquid, 0., isSolid) return eff_density * dx + lmbda / (2. * mu) * v * v * dx
def G(U): u = U[0] v = U[1] em = emin(u, v) eM = emax(u, v) martEnergy = 3. / 2. * pow((em + 1. / 3.), 2.) stiffEnergy = 3. / 2. * pow((em + 1. / 3.), 2.) + 1. / 2. * pow( (em + 2. * eM - 1.), 2.) isLiquid = And(And(gt(em, -1 / 3), lt(eM, -2. * em)), gt(eM, -em / 2.)) isMartensite = And(And(lt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2 + 1 / 2)) isStiff = conditional( And(And(lt(em, -1 / 3), gt(eM, -em / 2.)), lt(eM, -em / 2 + 1 / 2)), stiffEnergy, 0) isSolid = conditional(isMartensite, martEnergy, isStiff) eff_density = conditional(isLiquid, 0., isSolid) return eff_density * dx
def G(self, U): u = U[0] v = U[1] em = self.emin(u, v) eM = self.emax(u, v) martEnergy = 3. / 2. * pow((em + 1. / 3.), 2.) stiffEnergy = 3. / 2. * pow((em + 1. / 3.), 2.) + 1. / 2. * pow( (em + 2. * eM - 1.), 2.) isLiquid = And(And(gt(em, -1 / 3), lt(eM, -2. * em)), gt(eM, -em / 2.)) isMartensite = And(And(lt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2 + 1 / 2)) isStiff = conditional( And(And(lt(em, -1 / 3), gt(eM, -em / 2.)), lt(eM, -em / 2 + 1 / 2)), stiffEnergy, 0) isSolid = conditional(isMartensite, martEnergy, isStiff) eff_density = conditional(isLiquid, 0., isSolid) _lmbda = project(Constant(self.lmbda), FunctionSpace(self.mesh, 'DG', 0)) return eff_density * self.dx + _lmbda / (2. * self.mu) * v * v * self.dx
def isElastic(em, eM): return And(And(lt(em, -1 / 3), gt(eM, -em / 2.)), lt(eM, -em / 2 + 1 / 2))
def isMartensite(em, eM): return And(And(lt(em, -1 / 3), lt(eM, -2 * em)), gt(eM, -em / 2 + 1 / 2))
def isLiquid(em, eM): return And(And(gt(em, -1 / 3), lt(eM, -2. * em + DOLFIN_EPS)), gt(eM, -em / 2. - DOLFIN_EPS))