density summation

基类

ęØ”ęæDensitySummation<Base, DataDelegationType>ļ¼šę‰€ęœ‰DensitySummationēš„åŸŗē±»ć€‚ę˜ÆLocalDynamics和DataDelegationTypeēš„å…¬ęœ‰ē»§ę‰æć€‚å®ƒäøå®žēŽ°å…·ä½“interaction/updateļ¼ŒåŖč“Ÿč“£ļ¼šé€ščæ‡DataDelegateę‹æåˆ°ē²’å­/é‚»åŸŸé…ē½®ē­‰ę•°ę®å…„å£ē»‘å®š/ę³Øå†Œéœ€č¦ēš„ē²’å­å˜é‡ęŒ‡é’ˆäøŽåøøé‡ć€‚

Inneråˆ†ę”Æļ¼ˆåŒäø€ęµä½“ä½“å†…ēš„ē›øäŗ’ä½œē”Øļ¼‰

ęŒ‰ē…§äø‹å¼ę›“ę–°åÆ†åŗ¦ļ¼š

ρi=ρ0āˆ‘jWijāˆ‘jWij0\rho_i=\rho_0\frac{\sum_j W_{ij}}{\sum_j W_{ij}^{0}}

å…¶äø­Wij0W_{ij}^{0}äøŗåˆå§‹ę—¶åˆ»ļ¼ˆäø„ę ¼ę„čÆ“ę˜Æē²¾ē”®ęŒ‰ē…§LatticeęŽ’åøƒļ¼‰ēš„ę øå‡½ę•°å€¼ć€‚

实例DensitySummation<Inner<Base>>ļ¼šę‰€ęœ‰Innerē‰ˆęœ¬ēš„åŸŗē±»ć€‚åŖę˜ÆęŠŠå§”ę‰˜ē±»åž‹å›ŗå®šäøŗDataDelegateInner怂

  • 实例DensitySummation<Inner<>>ļ¼šåˆ«åDensitySummationInnerć€‚å®žēŽ°äŗ†interaction()+update()ć€‚ę˜Æęœ€åøøē”Øēš„ inneråÆ†åŗ¦ę±‚å’Œć€‚

  • 实例DensitySummation<Inner<Adaptive>>ć€‚å®žēŽ°äŗ†interaction()+update()ļ¼ˆåø¦å˜å…‰ę»‘é•æåŗ¦/自适应修正)。

Contactåˆ†ę”Æļ¼ˆäøŽęŽ„č§¦ä½“/å¤šä½“ęŽ„č§¦ē›øäŗ’ä½œē”Øļ¼‰

在Inneråˆ†ę”ÆåŸŗē”€äøŠę·»åŠ äŗ†äø€é”¹ļ¼Œē”Øäø‹ę ‡fč”Øē¤ŗęµä½“ļ¼š

⟨ρi⟩=ρf0āˆ‘jWijāˆ‘jWij0+ρf02miāˆ‘kWikmk/ρk0āˆ‘jWij0=ρf0āˆ‘jWij0(āˆ‘jWij+ρf0miāˆ‘kWikmkρk0)\begin{aligned} \langle\rho_i\rangle&=\rho_{f0}\frac{\sum_j W_{ij}}{\sum_j W_{ij}^{0}}+\frac{{\rho_{f0}}^2}{m_i}\frac{\sum_k W_{ik}m_k/\rho_{k0}}{\sum_j W_{ij}^0}\\ &=\frac{\rho_{f0}}{\sum_j W_{ij}^0}\left(\sum_j W_{ij}+\frac{\rho_{f0}}{m_i}\sum_k \frac{W_{ik}m_k}{\rho_{k0}}\right) \end{aligned}

čæ™é‡Œäø‹ę ‡jjč”Øē¤ŗęŸäøŖęµä½“ē²’å­ļ¼Œäø‹ę ‡kkč”Øē¤ŗęŸäøŖęŽ„č§¦ä½“ē²’å­ć€‚å‡č®¾åŖęœ‰äø€ē§ęŽ„č§¦ä½“ļ¼Œé‚£ä¹ˆĻk0\rho_{k0}和mkm_kę˜Æåøøę•°ļ¼Œęˆ‘ä»¬ęœ‰

⟨ρi⟩=ρf0āˆ‘jWij0(āˆ‘jWij+ρf0mkmiρk0āˆ‘kWik)=ρf0āˆ‘jWij0(āˆ‘jWij+Vk0Vj0āˆ‘kWik)\begin{aligned} \langle\rho_i\rangle&=\frac{\rho_{f0}}{\sum_j W_{ij}^0}\left(\sum_j W_{ij}+\frac{\rho_{f0}m_k}{m_i\rho_{k0}}\sum_k W_{ik}\right)\\ &=\frac{\rho_{f0}}{\sum_j W_{ij}^0}\left(\sum_j W_{ij}+\frac{V_{k0}}{V_{j0}}\sum_k W_{ik}\right) \end{aligned}

ę‰€ä»„ęŽ„č§¦ä½“ēš„density summationå®žé™…äøŠę˜Æä¹˜äŗ†äø€äøŖä½“ē§Æēš„ęƒé‡ć€‚å¦‚ęžœę‰€ęœ‰ē²’å­éƒ½ę˜Æē›øåŒé—“č·ļ¼Œé‚£ä¹ˆContactåˆ†ę”Æå’ŒInneråˆ†ę”Æå°±äø€ęØ”äø€ę ·äŗ†ć€‚ęµä½“ē²’å­ēš„density summationäøŽå£é¢ē²’å­ēš„åÆ†åŗ¦å®žé™…äøŠę˜Æę— å…³ēš„ļ¼ŒåŖäøŽä½“ē§Æęœ‰å…³ć€‚ę‰€ä»„å³ä½æå£é¢ę˜ÆåÆ†åŗ¦å¾ˆå¤§ēš„ęę–™ļ¼Œä¹Ÿäøä¼šä½æå¾—ęµä½“åœØåšå®Œdensity summationåŽåÆ†åŗ¦åé«˜ć€‚

实例DensitySummation<Contact<Base>>ļ¼šę‰€ęœ‰contactē‰ˆęœ¬ēš„åŸŗē±»ć€‚ęŠŠå§”ę‰˜ē±»åž‹å›ŗå®šäøŗDataDelegateContactć€‚ē¼“å­˜ęŽ„č§¦ä½“äæ”ęÆļ¼šcontact_inv_rho0_态contact_mass_ć€‚ęä¾›ContactSummation(index_i)ļ¼šåÆ¹ę‰€ęœ‰contacté‚»åŸŸåšäø€éåÆ†åŗ¦ę±‚å’Œć€‚

ę³Øę„ļ¼Œę‰€ęœ‰Contactåˆ†ę”Æå‡ę²”ęœ‰å®žēŽ°update()ęˆå‘˜å‡½ę•°ļ¼ŒåŖå®žēŽ°äŗ†interaction()ęˆå‘˜å‡½ę•°ć€‚čæ™ę˜Æå› äøŗå®ƒåœØčæ™å„—č®¾č®”é‡Œč¢«å½“ä½œā€œåÆ¹ rho_sum_ēš„å¢žé‡äæ®ę­£é”¹ļ¼ˆcorrection termļ¼‰ā€ļ¼Œč€Œäøę˜Æäø€äøŖā€œå®Œę•“ēš„åÆ†åŗ¦ę›“ę–°ē®—ę³•ā€ć€‚ęœ€ē»ˆęŠŠrho_sum_写回rho_ć€ä»„åŠē”±rho_ę“¾ē”Ÿå‡ŗVol_(Vol = mass / rhoļ¼‰čæ™ē±»ēŠ¶ę€č½ē›˜åŠØä½œļ¼Œåŗ”å½“ē”±Innerļ¼ˆęˆ–å…¶FreeSurface/NearSurfaceč£…é„°ē‰ˆļ¼‰ę„ē»Ÿäø€åšäø€ę¬”ļ¼Œéæå…é‡å¤/冲突。

  • 实例DensitySummation<Contact<>>ļ¼šå®žēŽ°interaction():把contactę±‚å’Œā€œåŠ åˆ°ā€rho_sum_ äøŠć€‚

  • 实例DensitySummation<Contact<Adaptive>>ć€‚å®žēŽ°interaction()ļ¼šäøŽContact<>ē±»ä¼¼ļ¼Œä½†åÆ¹č‡Ŗé€‚åŗ”åšNumberDensityScaleFactor(h_ratio)修正。

FreeSurface/NearSurfaceå åŠ åˆ†ę”Æļ¼ˆåŖę”¹updateč§„åˆ™ļ¼‰

SummationTypeåÆä»„ę˜Æē©ŗęˆ–č€…Adaptive怂

ęØ”ęæDensitySummation<Inner<FreeSurface, SummationType...>>ļ¼šē»§ę‰æč‡ŖDensitySummation<Inner<SummationType...>>ć€‚åŖå®žēŽ°update():rho = max(rho_sum, rho0)ļ¼ˆéæå…č‡Ŗē”±é¢å¤„äøåˆē†ä½ŽåÆ†åŗ¦ļ¼‰ć€‚

  • 实例using DensitySummationFreeSurfaceInner = DensitySummation<Inner<FreeSurface>>;ć€‚čæ™é‡ŒSummationTypeę˜Æē©ŗć€‚

    ⟨ρi⟩=max⁔{ρ0āˆ‘jWijāˆ‘jWij0,ρ0}\langle\rho_i\rangle=\max\left\{\rho_0\frac{\sum_j W_{ij}}{\sum_j W_{ij}^{0}}, \rho_0\right\}

FreeStreamäøŽNotNearSurfaceļ¼šäø¤äøŖā€œNearSurfaceType policy functorā€

  • NotNearSurfaceļ¼ščæ‘č”Øé¢å°±ē›“ęŽ„čæ”å›žrhoļ¼ˆē›øå½“äŗŽäæęŒåŽŸå€¼ļ¼Œäøē”Ørho_sum)。

  • FreeStreamļ¼šå¦‚ęžœrho_sum < rhoļ¼ŒęŒ‰ęÆ”ä¾‹ęŠŠē¼ŗå£č”„äø€ē‚¹ļ¼ˆę›“ā€œęø©å’Œā€ēš„č‡Ŗē”±ęµäæ®ę­£ļ¼‰ā€”ā€”rho_sum + SMAX(Real(0), (rho - rho_sum)) * rho0 / rho怂

ęØ”ęæDensitySummation<Inner<NearSurfaceType, SummationType...>>:NearSurfaceTypeęŒ‡ēš„ę˜ÆFreeStream和NotNearSurfaceć€‚åŖå®žēŽ°update()ļ¼šå¦‚ęžœā€œé čæ‘č‡Ŗē”±é¢ā€åˆ™ē”Ønear_surface_rho_(rho_sum,rho0,rho)ļ¼Œå¦åˆ™ē”Ørho_sum é€ščæ‡ē²’å­å˜é‡Indicator+å†…é‚»åŸŸåˆ¤ę–­isNearFreeSurface(i)åŖč¦é‚»å±…é‡Œęœ‰Indicator==1就认为near surface)

  • 实例using DensitySummationInnerNotNearSurface = DensitySummation<Inner<NotNearSurface>>;

  • 实例using DensitySummationInnerFreeStream = DensitySummation<Inner<FreeStream>>;

    ρisum=ρ0āˆ‘jWijāˆ‘jWij0\rho_i^\mathrm{sum}=\rho_0\frac{\sum_j W_{ij}}{\sum_j W_{ij}^{0}}
    ⟨ρi⟩={ρisum+max⁔{0,ρiāˆ’Ļisum}ρ0/ρi,iĀ hasĀ freeĀ surfaceĀ neighbor(s);ρisum,else.\langle\rho_i\rangle=\begin{cases} \rho_i^\mathrm{sum}+\max\{0,\rho_i-\rho_i^\mathrm{sum}\}\rho_0/\rho_i,& i\text{ has free surface neighbor(s)};\\ \rho_i^\mathrm{sum},& \text{else}. \end{cases}

    ē­‰ä»·äŗŽ

    ⟨ρi⟩={ρisum,iĀ hasĀ noĀ freeĀ surfaceĀ neighborĀ or ρi<ρisum;ρisum(1āˆ’Ļ0/ρi)+ρ0,else.\langle\rho_i\rangle=\begin{cases} \rho_i^\mathrm{sum},& i\text{ has no free surface neighbor or }\rho_i < \rho_i^\mathrm{sum};\\ \rho_i^\mathrm{sum}(1-\rho_0/\rho_i)+\rho_0,& \text{else}.\\ \end{cases}

    åÆ¹äŗŽč”Øé¢ē²’å­ęˆ–č€…čæ‘č”Øé¢ē²’å­ļ¼Œäø€čˆ¬ä¼šęœ‰

    1. ρ0>ρi\rho_0>\rho_iļ¼ŒäŗŽę˜ÆāŸØĻi⟩<ρ0\langle\rho_i\rangle<\rho_0怂

    2. ρi>ρisum\rho_i > \rho_i^\mathrm{sum}ļ¼ŒäŗŽę˜ÆāŸØĻi⟩>ρisum\langle\rho_i\rangle > \rho_i^\mathrm{sum}怂

    ä¹Ÿå³Ļisum<⟨ρi⟩<ρ0\rho_i^\mathrm{sum} < \langle\rho_i\rangle < \rho_0ć€‚ę‰€ä»„ęˆ‘ä»¬åÆä»„č®¤äøŗFreeStreamē±»åž‹ēš„density summationå°†č¾¹ē•Œē²’å­ēš„āŸØĻi⟩\langle\rho_i\rangleę‹‰é«˜äŗ†äø€äŗ›ļ¼Œä½†ę²”ęœ‰åƒFreeSurfaceē±»åž‹é‚£ę ·ē›“ęŽ„ę‹‰é«˜åˆ°å‚č€ƒåÆ†åŗ¦ļ¼Œå› ę­¤čæ™ę˜Æäø€ē§ę›“č½Æēš„å¤„ē†ć€‚

å¤åˆē±»åž‹ļ¼ˆInner+Contactēš„ē»„åˆļ¼‰

å¤åˆē±»åž‹ēš„åŸŗē±»ļ¼š

  • using DensitySummationComplex = BaseDensitySummationComplex<Inner<>, Contact<>>;

  • using DensitySummationComplexAdaptive = BaseDensitySummationComplex<Inner<Adaptive>, Contact<Adaptive>>;

  • using DensitySummationComplexFreeSurface = BaseDensitySummationComplex<Inner<FreeSurface>, Contact<>>;

  • using DensitySummationFreeSurfaceComplexAdaptive = BaseDensitySummationComplex<Inner<FreeSurface, Adaptive>, Contact<Adaptive>>;

  • using DensitySummationFreeStreamComplex = BaseDensitySummationComplex<Inner<FreeStream>, Contact<>>;

  • using DensitySummationFreeStreamComplexAdaptive = BaseDensitySummationComplex<Inner<FreeStream, Adaptive>, Contact<Adaptive>>;

  • using DensitySummationNotNearSurfaceComplex = BaseDensitySummationComplex<Inner<NotNearSurface>, Contact<>>;

é’ˆåÆ¹åŽ‹åŠ›č¾¹ē•Œēš„ē‰ˆęœ¬

č®¾ē½®åŽ‹åŠ›č¾¹ē•Œę—¶ļ¼Œäø€čˆ¬ä¼šåŒę­„č®¾ē½®BidirectionalBuffer怂density summationé»˜č®¤é’ˆåÆ¹ę‰€ęœ‰ęµä½“ē²’å­ć€‚ä½†ę˜ÆåœØbufferåŒŗåŸŸäø­ēš„ē²’å­ä½æē”Øtarget pressureę›“ę–°åÆ†åŗ¦ļ¼š

ρi=pb/c2+ρ0\rho_i=p_\mathrm{b}/c^2+\rho_0

ę‰€ä»„éœ€č¦åÆ¹é»˜č®¤ēš„density summationåšäø€äøŖę”¹čæ›ā€”ā€”čÆ†åˆ«ē²’å­ę˜Æå¦äøŗå†…éƒØęµåŠØåŒŗåŸŸēš„ē²’å­ļ¼ŒåŖęœ‰å½“ę”ä»¶ę»”č¶³ę—¶ļ¼Œę‰åšdensity summation怂见tests\extra_source_and_tests\extra_src\shared\pressure_boundary\density_correciton.h:

å…¶äø­assignDensity(index_i)åšēš„ę˜Ærho_[index_i] = rho_sum_[index_i];怂

Last updated