# Position vectors Zeta01=smarr.MutableDenseNDimArray([zeta01_x,zeta01_y]) Zeta02=smarr.MutableDenseNDimArray([zeta02_x,zeta02_y]) # define order of derivation ZetaAllList=[zeta01_x,zeta02_x,zeta01_y,zeta02_y] # Delta vector (and derivative) Dzeta=Zeta02-Zeta01 Dzeta_unit=Dzeta/sm.sqrt(linfunc.scalar_product(Dzeta,Dzeta)) #Dzeta_unit=Dzeta_unit.simplify() # Normal Norm=linfunc.matrix_product(Kskew2D,Dzeta_unit) Norm=linfunc.simplify(Norm) ### check norm assert linfunc.scalar_product(Norm,Dzeta).simplify()==0, 'Norm is wrong' assert linfunc.scalar_product(Norm,Dzeta_unit).simplify()==0, 'Norm is wrong' assert linfunc.scalar_product(Norm,Norm).simplify()==1, 'Normal is not unit length' # Normal velocity Vperp=linfunc.scalar_product(Norm,V0) ### Derivatives / with verification # derX[i,j] is the derivative of X[i] w.r.t ZetaAllList[j] # Normal
R02 = ZetaCB - Zeta02 # Velocity induced by a segment def Vind_segment(R, cf, g): BiotTerm = cf * g * R / linfunc.scalar_product(R, R) Qind = linfunc.matrix_product(Kskew2D, BiotTerm) return linfunc.simplify(Qind) # Full vortex velocity Qind_vortex = Vind_segment(R01, CF, Gamma) - Vind_segment(R02, CF, Gamma) # Joukovski force Fjouk = -gamma_s * linfunc.matrix_product(Kskew2D, Qind_vortex) Fjouk = linfunc.simplify(Fjouk) ### Derivative Der = sm.derive_by_array(Fjouk, ZetaAllList).transpose() # 2x6 #Der=linfunc.simplify(Der) ### Verification BiotTerm_vortex = +CF*Gamma*R01/linfunc.scalar_product(R01,R01) \ -CF*Gamma*R02/linfunc.scalar_product(R02,R02) derBiotTerm = sm.derive_by_array(BiotTerm_vortex, ZetaAllList).transpose() derQind = linfunc.matrix_product(Kskew2D, derBiotTerm) Der2 = -gamma_s * linfunc.matrix_product(Kskew2D, derQind) check = linfunc.simplify(Der - Der2) assert linfunc.scalar_product(check, check) == 0, 'Derivatives are not the same'
def Vind_segment(R, cf, g): BiotTerm = cf * g * R / linfunc.scalar_product(R, R) Qind = linfunc.matrix_product(Kskew2D, BiotTerm) return linfunc.simplify(Qind)
# Position vectors Zeta01=smarr.MutableDenseNDimArray([zeta01_x,zeta01_y]) Zeta02=smarr.MutableDenseNDimArray([zeta02_x,zeta02_y]) # define order of derivation ZetaAllList=[zeta01_x,zeta02_x,zeta01_y,zeta02_y] # Delta vector (and derivative) Dzeta=Zeta02-Zeta01 Area=sm.sqrt(linfunc.scalar_product(Dzeta,Dzeta)) Dzeta_unit=Dzeta/Area # Normal Norm=linfunc.matrix_product(Kskew2D,Dzeta_unit) Norm=linfunc.simplify(Norm) ### check norm assert linfunc.scalar_product(Norm,Dzeta).simplify()==0, 'Norm is wrong' assert linfunc.scalar_product(Norm,Dzeta_unit).simplify()==0, 'Norm is wrong' assert linfunc.scalar_product(Norm,Norm).simplify()==1, 'Normal is not unit length' # Normal by Area derivative NA=Area*Norm derNA=sm.derive_by_array(NA,ZetaAllList).transpose() derNA=linfunc.simplify(derNA) # Verify Normal by Area derivative derDzeta=sm.derive_by_array(Dzeta,ZetaAllList).transpose() derDzeta=linfunc.simplify(derDzeta)