diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c1a8967b8685fa24d4a55754bfb6ea957a78adc..8353626dd807af9ccf4c53217441e86cf8c765f2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,10 +42,13 @@ stages: # to be implemented ... # pkkprime stages - build_pkkprime - # run and verift stages not defined yet + # run and verify stages not defined yet # rhoq stages - build_rhoq - # run and verift stages not defined yet + # run and verify stages not defined yet + # kkrnano stages + - build_kkrnano + - run_kkrnano ############################################################################### @@ -81,12 +84,14 @@ include: - tests/gitlab-ci/build_pkkprime.yml - tests/gitlab-ci/build_voronoi.yml - tests/gitlab-ci/build_rhoq.yml + - tests/gitlab-ci/build_kkrnano.yml ### 2. run tests ### - tests/gitlab-ci/run_kkrhost.yml - tests/gitlab-ci/run_kkrimp.yml #- tests/gitlab-ci/run_kkrsusc.yml #- tests/gitlab-ci/run_pkkprime.yml - tests/gitlab-ci/run_voronoi.yml + - tests/gitlab-ci/run_kkrnano.yml ### 3. verify results ### - tests/gitlab-ci/verify_kkrhost.yml - tests/gitlab-ci/verify_kkrimp.yml diff --git a/ElementDataBase/Bi83.pot b/ElementDataBase/Bi83.pot new file mode 100644 index 0000000000000000000000000000000000000000..a5bf472da8302772700c6f183ff25622614e95af --- /dev/null +++ b/ElementDataBase/Bi83.pot @@ -0,0 +1,393 @@ + SET HEADER SET HEADER SET HEADER VWN +RWS = 3.0000 S1 = 15.0000 IRS1 = 1501 BR = 0.0002 +ZTOTI = 83.0000 ZVALI= 5.0000 NSEC = 6 EINF = -0.8000 + 1s -0.66581904D+04 + 2s -0.11960670D+04 + 3s -0.28816249D+03 + 4s -0.65875111D+02 + 5s -0.11122339D+02 + 2p -0.10236535D+04 + 3p -0.23888858D+03 + 4p -0.49721207D+02 + 5p -0.65531353D+01 + 3d -0.18921115D+03 + 4d -0.31230217D+02 + 5d -0.14771281D+01 + 4f -0.10847212D+02 + 0.16958870D+04 0.15283100D+04 0.13594739D+04 0.12888273D+04 + 0.12484627D+04 0.12219777D+04 0.12030884D+04 0.11888616D+04 + 0.11777256D+04 0.11687551D+04 0.11613662D+04 0.11551710D+04 + 0.11499008D+04 0.11453634D+04 0.11414169D+04 0.11379544D+04 + 0.11348940D+04 0.11321711D+04 0.11297346D+04 0.11275435D+04 + 0.11255642D+04 0.11237690D+04 0.11221350D+04 0.11206428D+04 + 0.11192763D+04 0.11180216D+04 0.11168667D+04 0.11158014D+04 + 0.11148169D+04 0.11139054D+04 0.11130601D+04 0.11122752D+04 + 0.11115452D+04 0.11108656D+04 0.11102322D+04 0.11096413D+04 + 0.11090895D+04 0.11085740D+04 0.11080920D+04 0.11076410D+04 + 0.11072189D+04 0.11068237D+04 0.11064536D+04 0.11061068D+04 + 0.11057820D+04 0.11054776D+04 0.11051925D+04 0.11049254D+04 + 0.11046753D+04 0.11044411D+04 0.11042220D+04 0.11040172D+04 + 0.11038257D+04 0.11036469D+04 0.11034802D+04 0.11033248D+04 + 0.11031802D+04 0.11030458D+04 0.11029211D+04 0.11028057D+04 + 0.11026990D+04 0.11026007D+04 0.11025104D+04 0.11024277D+04 + 0.11023522D+04 0.11022837D+04 0.11022217D+04 0.11021661D+04 + 0.11021165D+04 0.11020727D+04 0.11020344D+04 0.11020014D+04 + 0.11019735D+04 0.11019505D+04 0.11019322D+04 0.11019183D+04 + 0.11019088D+04 0.11019034D+04 0.11019020D+04 0.11019044D+04 + 0.11019105D+04 0.11019202D+04 0.11019332D+04 0.11019496D+04 + 0.11019691D+04 0.11019917D+04 0.11020172D+04 0.11020456D+04 + 0.11020767D+04 0.11021105D+04 0.11021468D+04 0.11021856D+04 + 0.11022268D+04 0.11022702D+04 0.11023159D+04 0.11023638D+04 + 0.11024137D+04 0.11024657D+04 0.11025196D+04 0.11025754D+04 + 0.11026330D+04 0.11026924D+04 0.11027535D+04 0.11028163D+04 + 0.11028806D+04 0.11029466D+04 0.11030140D+04 0.11030829D+04 + 0.11031532D+04 0.11032249D+04 0.11032979D+04 0.11033722D+04 + 0.11034478D+04 0.11035246D+04 0.11036026D+04 0.11036817D+04 + 0.11037619D+04 0.11038432D+04 0.11039255D+04 0.11040089D+04 + 0.11040932D+04 0.11041785D+04 0.11042647D+04 0.11043518D+04 + 0.11044398D+04 0.11045286D+04 0.11046183D+04 0.11047087D+04 + 0.11047999D+04 0.11048919D+04 0.11049846D+04 0.11050780D+04 + 0.11051721D+04 0.11052668D+04 0.11053622D+04 0.11054583D+04 + 0.11055549D+04 0.11056521D+04 0.11057499D+04 0.11058482D+04 + 0.11059470D+04 0.11060464D+04 0.11061463D+04 0.11062466D+04 + 0.11063474D+04 0.11064487D+04 0.11065504D+04 0.11066525D+04 + 0.11067550D+04 0.11068579D+04 0.11069612D+04 0.11070648D+04 + 0.11071688D+04 0.11072731D+04 0.11073778D+04 0.11074827D+04 + 0.11075880D+04 0.11076935D+04 0.11077993D+04 0.11079054D+04 + 0.11080117D+04 0.11081183D+04 0.11082250D+04 0.11083320D+04 + 0.11084392D+04 0.11085466D+04 0.11086541D+04 0.11087618D+04 + 0.11088697D+04 0.11089777D+04 0.11090859D+04 0.11091942D+04 + 0.11093026D+04 0.11094111D+04 0.11095197D+04 0.11096283D+04 + 0.11097371D+04 0.11098459D+04 0.11099548D+04 0.11100637D+04 + 0.11101727D+04 0.11102817D+04 0.11103907D+04 0.11104997D+04 + 0.11106087D+04 0.11107177D+04 0.11108267D+04 0.11109356D+04 + 0.11110445D+04 0.11111534D+04 0.11112622D+04 0.11113709D+04 + 0.11114796D+04 0.11115882D+04 0.11116967D+04 0.11118051D+04 + 0.11119133D+04 0.11120215D+04 0.11121295D+04 0.11122374D+04 + 0.11123451D+04 0.11124527D+04 0.11125602D+04 0.11126674D+04 + 0.11127745D+04 0.11128813D+04 0.11129880D+04 0.11130945D+04 + 0.11132007D+04 0.11133068D+04 0.11134125D+04 0.11135181D+04 + 0.11136234D+04 0.11137284D+04 0.11138331D+04 0.11139376D+04 + 0.11140418D+04 0.11141457D+04 0.11142493D+04 0.11143525D+04 + 0.11144554D+04 0.11145580D+04 0.11146603D+04 0.11147622D+04 + 0.11148637D+04 0.11149649D+04 0.11150656D+04 0.11151660D+04 + 0.11152660D+04 0.11153655D+04 0.11154647D+04 0.11155634D+04 + 0.11156617D+04 0.11157595D+04 0.11158569D+04 0.11159538D+04 + 0.11160502D+04 0.11161461D+04 0.11162415D+04 0.11163364D+04 + 0.11164308D+04 0.11165247D+04 0.11166180D+04 0.11167108D+04 + 0.11168030D+04 0.11168946D+04 0.11169856D+04 0.11170761D+04 + 0.11171659D+04 0.11172552D+04 0.11173438D+04 0.11174318D+04 + 0.11175191D+04 0.11176058D+04 0.11176918D+04 0.11177771D+04 + 0.11178617D+04 0.11179456D+04 0.11180288D+04 0.11181113D+04 + 0.11181930D+04 0.11182740D+04 0.11183542D+04 0.11184337D+04 + 0.11185123D+04 0.11185902D+04 0.11186672D+04 0.11187435D+04 + 0.11188189D+04 0.11188934D+04 0.11189671D+04 0.11190399D+04 + 0.11191118D+04 0.11191828D+04 0.11192530D+04 0.11193222D+04 + 0.11193904D+04 0.11194577D+04 0.11195240D+04 0.11195894D+04 + 0.11196538D+04 0.11197171D+04 0.11197795D+04 0.11198408D+04 + 0.11199011D+04 0.11199603D+04 0.11200184D+04 0.11200755D+04 + 0.11201314D+04 0.11201863D+04 0.11202400D+04 0.11202925D+04 + 0.11203439D+04 0.11203941D+04 0.11204432D+04 0.11204910D+04 + 0.11205376D+04 0.11205830D+04 0.11206271D+04 0.11206699D+04 + 0.11207115D+04 0.11207518D+04 0.11207907D+04 0.11208284D+04 + 0.11208647D+04 0.11208996D+04 0.11209331D+04 0.11209653D+04 + 0.11209960D+04 0.11210253D+04 0.11210532D+04 0.11210796D+04 + 0.11211046D+04 0.11211280D+04 0.11211499D+04 0.11211703D+04 + 0.11211892D+04 0.11212065D+04 0.11212222D+04 0.11212363D+04 + 0.11212488D+04 0.11212597D+04 0.11212689D+04 0.11212764D+04 + 0.11212823D+04 0.11212864D+04 0.11212889D+04 0.11212895D+04 + 0.11212885D+04 0.11212856D+04 0.11212809D+04 0.11212744D+04 + 0.11212661D+04 0.11212560D+04 0.11212439D+04 0.11212300D+04 + 0.11212141D+04 0.11211963D+04 0.11211766D+04 0.11211548D+04 + 0.11211311D+04 0.11211054D+04 0.11210776D+04 0.11210478D+04 + 0.11210159D+04 0.11209819D+04 0.11209458D+04 0.11209076D+04 + 0.11208672D+04 0.11208246D+04 0.11207798D+04 0.11207328D+04 + 0.11206836D+04 0.11206321D+04 0.11205783D+04 0.11205223D+04 + 0.11204638D+04 0.11204031D+04 0.11203400D+04 0.11202745D+04 + 0.11202065D+04 0.11201362D+04 0.11200634D+04 0.11199881D+04 + 0.11199103D+04 0.11198300D+04 0.11197472D+04 0.11196617D+04 + 0.11195737D+04 0.11194831D+04 0.11193899D+04 0.11192940D+04 + 0.11191954D+04 0.11190941D+04 0.11189901D+04 0.11188834D+04 + 0.11187738D+04 0.11186615D+04 0.11185464D+04 0.11184284D+04 + 0.11183076D+04 0.11181839D+04 0.11180573D+04 0.11179278D+04 + 0.11177953D+04 0.11176598D+04 0.11175214D+04 0.11173799D+04 + 0.11172354D+04 0.11170878D+04 0.11169371D+04 0.11167833D+04 + 0.11166264D+04 0.11164663D+04 0.11163030D+04 0.11161365D+04 + 0.11159668D+04 0.11157938D+04 0.11156176D+04 0.11154380D+04 + 0.11152552D+04 0.11150690D+04 0.11148794D+04 0.11146864D+04 + 0.11144901D+04 0.11142903D+04 0.11140870D+04 0.11138802D+04 + 0.11136700D+04 0.11134562D+04 0.11132388D+04 0.11130179D+04 + 0.11127934D+04 0.11125653D+04 0.11123335D+04 0.11120981D+04 + 0.11118590D+04 0.11116161D+04 0.11113696D+04 0.11111193D+04 + 0.11108652D+04 0.11106073D+04 0.11103456D+04 0.11100801D+04 + 0.11098107D+04 0.11095375D+04 0.11092603D+04 0.11089792D+04 + 0.11086942D+04 0.11084052D+04 0.11081122D+04 0.11078152D+04 + 0.11075142D+04 0.11072091D+04 0.11069000D+04 0.11065868D+04 + 0.11062695D+04 0.11059480D+04 0.11056224D+04 0.11052927D+04 + 0.11049587D+04 0.11046206D+04 0.11042783D+04 0.11039317D+04 + 0.11035808D+04 0.11032257D+04 0.11028663D+04 0.11025026D+04 + 0.11021345D+04 0.11017622D+04 0.11013854D+04 0.11010043D+04 + 0.11006188D+04 0.11002289D+04 0.10998345D+04 0.10994358D+04 + 0.10990325D+04 0.10986248D+04 0.10982127D+04 0.10977960D+04 + 0.10973748D+04 0.10969491D+04 0.10965189D+04 0.10960841D+04 + 0.10956447D+04 0.10952008D+04 0.10947522D+04 0.10942991D+04 + 0.10938414D+04 0.10933790D+04 0.10929120D+04 0.10924404D+04 + 0.10919641D+04 0.10914832D+04 0.10909975D+04 0.10905072D+04 + 0.10900122D+04 0.10895125D+04 0.10890081D+04 0.10884990D+04 + 0.10879851D+04 0.10874666D+04 0.10869433D+04 0.10864152D+04 + 0.10858824D+04 0.10853448D+04 0.10848025D+04 0.10842555D+04 + 0.10837036D+04 0.10831470D+04 0.10825856D+04 0.10820194D+04 + 0.10814484D+04 0.10808727D+04 0.10802922D+04 0.10797068D+04 + 0.10791167D+04 0.10785218D+04 0.10779221D+04 0.10773176D+04 + 0.10767083D+04 0.10760943D+04 0.10754754D+04 0.10748517D+04 + 0.10742233D+04 0.10735900D+04 0.10729520D+04 0.10723092D+04 + 0.10716616D+04 0.10710092D+04 0.10703521D+04 0.10696902D+04 + 0.10690235D+04 0.10683521D+04 0.10676759D+04 0.10669950D+04 + 0.10663093D+04 0.10656188D+04 0.10649237D+04 0.10642238D+04 + 0.10635192D+04 0.10628099D+04 0.10620958D+04 0.10613771D+04 + 0.10606537D+04 0.10599256D+04 0.10591928D+04 0.10584553D+04 + 0.10577132D+04 0.10569665D+04 0.10562151D+04 0.10554590D+04 + 0.10546984D+04 0.10539331D+04 0.10531632D+04 0.10523887D+04 + 0.10516097D+04 0.10508260D+04 0.10500378D+04 0.10492451D+04 + 0.10484477D+04 0.10476459D+04 0.10468395D+04 0.10460286D+04 + 0.10452133D+04 0.10443934D+04 0.10435690D+04 0.10427402D+04 + 0.10419068D+04 0.10410691D+04 0.10402269D+04 0.10393802D+04 + 0.10385291D+04 0.10376736D+04 0.10368137D+04 0.10359494D+04 + 0.10350808D+04 0.10342077D+04 0.10333303D+04 0.10324485D+04 + 0.10315623D+04 0.10306718D+04 0.10297770D+04 0.10288778D+04 + 0.10279743D+04 0.10270665D+04 0.10261544D+04 0.10252380D+04 + 0.10243172D+04 0.10233922D+04 0.10224629D+04 0.10215293D+04 + 0.10205915D+04 0.10196494D+04 0.10187030D+04 0.10177523D+04 + 0.10167974D+04 0.10158382D+04 0.10148748D+04 0.10139071D+04 + 0.10129352D+04 0.10119590D+04 0.10109786D+04 0.10099939D+04 + 0.10090050D+04 0.10080118D+04 0.10070144D+04 0.10060127D+04 + 0.10050068D+04 0.10039966D+04 0.10029822D+04 0.10019635D+04 + 0.10009406D+04 0.99991342D+03 0.99888197D+03 0.99784626D+03 + 0.99680629D+03 0.99576204D+03 0.99471352D+03 0.99366073D+03 + 0.99260366D+03 0.99154230D+03 0.99047666D+03 0.98940672D+03 + 0.98833250D+03 0.98725398D+03 0.98617115D+03 0.98508403D+03 + 0.98399260D+03 0.98289686D+03 0.98179681D+03 0.98069244D+03 + 0.97958376D+03 0.97847076D+03 0.97735345D+03 0.97623181D+03 + 0.97510586D+03 0.97397558D+03 0.97284099D+03 0.97170208D+03 + 0.97055886D+03 0.96941132D+03 0.96825947D+03 0.96710332D+03 + 0.96594286D+03 0.96477811D+03 0.96360906D+03 0.96243573D+03 + 0.96125812D+03 0.96007624D+03 0.95889011D+03 0.95769972D+03 + 0.95650509D+03 0.95530622D+03 0.95410314D+03 0.95289586D+03 + 0.95168438D+03 0.95046872D+03 0.94924890D+03 0.94802493D+03 + 0.94679682D+03 0.94556460D+03 0.94432828D+03 0.94308787D+03 + 0.94184341D+03 0.94059490D+03 0.93934236D+03 0.93808581D+03 + 0.93682528D+03 0.93556079D+03 0.93429235D+03 0.93301998D+03 + 0.93174371D+03 0.93046355D+03 0.92917953D+03 0.92789167D+03 + 0.92659999D+03 0.92530451D+03 0.92400525D+03 0.92270223D+03 + 0.92139548D+03 0.92008500D+03 0.91877082D+03 0.91745296D+03 + 0.91613144D+03 0.91480628D+03 0.91347748D+03 0.91214508D+03 + 0.91080908D+03 0.90946951D+03 0.90812637D+03 0.90677968D+03 + 0.90542945D+03 0.90407570D+03 0.90271843D+03 0.90135766D+03 + 0.89999340D+03 0.89862566D+03 0.89725444D+03 0.89587976D+03 + 0.89450161D+03 0.89312000D+03 0.89173495D+03 0.89034645D+03 + 0.88895450D+03 0.88755911D+03 0.88616028D+03 0.88475801D+03 + 0.88335230D+03 0.88194315D+03 0.88053055D+03 0.87911450D+03 + 0.87769501D+03 0.87627206D+03 0.87484566D+03 0.87341579D+03 + 0.87198246D+03 0.87054565D+03 0.86910536D+03 0.86766159D+03 + 0.86621432D+03 0.86476355D+03 0.86330927D+03 0.86185148D+03 + 0.86039016D+03 0.85892531D+03 0.85745693D+03 0.85598499D+03 + 0.85450950D+03 0.85303045D+03 0.85154783D+03 0.85006164D+03 + 0.84857186D+03 0.84707849D+03 0.84558153D+03 0.84408096D+03 + 0.84257679D+03 0.84106901D+03 0.83955761D+03 0.83804259D+03 + 0.83652396D+03 0.83500170D+03 0.83347582D+03 0.83194631D+03 + 0.83041318D+03 0.82887642D+03 0.82733605D+03 0.82579205D+03 + 0.82424444D+03 0.82269323D+03 0.82113841D+03 0.81957999D+03 + 0.81801798D+03 0.81645239D+03 0.81488323D+03 0.81331051D+03 + 0.81173423D+03 0.81015442D+03 0.80857109D+03 0.80698425D+03 + 0.80539391D+03 0.80380009D+03 0.80220282D+03 0.80060209D+03 + 0.79899795D+03 0.79739040D+03 0.79577946D+03 0.79416516D+03 + 0.79254752D+03 0.79092656D+03 0.78930230D+03 0.78767476D+03 + 0.78604398D+03 0.78440997D+03 0.78277277D+03 0.78113238D+03 + 0.77948885D+03 0.77784220D+03 0.77619245D+03 0.77453963D+03 + 0.77288376D+03 0.77122487D+03 0.76956299D+03 0.76789815D+03 + 0.76623037D+03 0.76455967D+03 0.76288608D+03 0.76120963D+03 + 0.75953034D+03 0.75784823D+03 0.75616333D+03 0.75447567D+03 + 0.75278526D+03 0.75109213D+03 0.74939630D+03 0.74769779D+03 + 0.74599662D+03 0.74429281D+03 0.74258638D+03 0.74087735D+03 + 0.73916574D+03 0.73745156D+03 0.73573483D+03 0.73401556D+03 + 0.73229377D+03 0.73056948D+03 0.72884270D+03 0.72711344D+03 + 0.72538172D+03 0.72364755D+03 0.72191093D+03 0.72017190D+03 + 0.71843044D+03 0.71668659D+03 0.71494034D+03 0.71319171D+03 + 0.71144072D+03 0.70968738D+03 0.70793169D+03 0.70617368D+03 + 0.70441335D+03 0.70265072D+03 0.70088580D+03 0.69911861D+03 + 0.69734917D+03 0.69557749D+03 0.69380360D+03 0.69202750D+03 + 0.69024922D+03 0.68846878D+03 0.68668620D+03 0.68490151D+03 + 0.68311472D+03 0.68132586D+03 0.67953497D+03 0.67774205D+03 + 0.67594715D+03 0.67415029D+03 0.67235150D+03 0.67055081D+03 + 0.66874824D+03 0.66694384D+03 0.66513762D+03 0.66332963D+03 + 0.66151989D+03 0.65970843D+03 0.65789529D+03 0.65608050D+03 + 0.65426409D+03 0.65244609D+03 0.65062653D+03 0.64880544D+03 + 0.64698285D+03 0.64515879D+03 0.64333329D+03 0.64150637D+03 + 0.63967807D+03 0.63784840D+03 0.63601739D+03 0.63418506D+03 + 0.63235143D+03 0.63051654D+03 0.62868038D+03 0.62684299D+03 + 0.62500439D+03 0.62316458D+03 0.62132359D+03 0.61948142D+03 + 0.61763810D+03 0.61579364D+03 0.61394804D+03 0.61210133D+03 + 0.61025350D+03 0.60840458D+03 0.60655457D+03 0.60470348D+03 + 0.60285132D+03 0.60099811D+03 0.59914385D+03 0.59728855D+03 + 0.59543222D+03 0.59357488D+03 0.59171653D+03 0.58985720D+03 + 0.58799688D+03 0.58613560D+03 0.58427337D+03 0.58241021D+03 + 0.58054614D+03 0.57868117D+03 0.57681532D+03 0.57494863D+03 + 0.57308110D+03 0.57121277D+03 0.56934366D+03 0.56747381D+03 + 0.56560324D+03 0.56373198D+03 0.56186008D+03 0.55998756D+03 + 0.55811447D+03 0.55624085D+03 0.55436674D+03 0.55249218D+03 + 0.55061722D+03 0.54874190D+03 0.54686629D+03 0.54499042D+03 + 0.54311436D+03 0.54123816D+03 0.53936187D+03 0.53748555D+03 + 0.53560926D+03 0.53373306D+03 0.53185702D+03 0.52998119D+03 + 0.52810564D+03 0.52623043D+03 0.52435562D+03 0.52248128D+03 + 0.52060748D+03 0.51873428D+03 0.51686173D+03 0.51498992D+03 + 0.51311889D+03 0.51124872D+03 0.50937947D+03 0.50751119D+03 + 0.50564394D+03 0.50377779D+03 0.50191279D+03 0.50004900D+03 + 0.49818648D+03 0.49632526D+03 0.49446541D+03 0.49260697D+03 + 0.49074999D+03 0.48889452D+03 0.48704059D+03 0.48518824D+03 + 0.48333752D+03 0.48148845D+03 0.47964108D+03 0.47779543D+03 + 0.47595153D+03 0.47410942D+03 0.47226910D+03 0.47043062D+03 + 0.46859399D+03 0.46675924D+03 0.46492638D+03 0.46309543D+03 + 0.46126642D+03 0.45943936D+03 0.45761426D+03 0.45579115D+03 + 0.45397005D+03 0.45215097D+03 0.45033393D+03 0.44851894D+03 + 0.44670604D+03 0.44489524D+03 0.44308656D+03 0.44128002D+03 + 0.43947566D+03 0.43767349D+03 0.43587355D+03 0.43407585D+03 + 0.43228043D+03 0.43048732D+03 0.42869654D+03 0.42690814D+03 + 0.42512214D+03 0.42333856D+03 0.42155746D+03 0.41977884D+03 + 0.41800276D+03 0.41622923D+03 0.41445829D+03 0.41268996D+03 + 0.41092428D+03 0.40916126D+03 0.40740093D+03 0.40564332D+03 + 0.40388843D+03 0.40213630D+03 0.40038694D+03 0.39864035D+03 + 0.39689655D+03 0.39515554D+03 0.39341734D+03 0.39168194D+03 + 0.38994934D+03 0.38821955D+03 0.38649256D+03 0.38476836D+03 + 0.38304694D+03 0.38132830D+03 0.37961243D+03 0.37789930D+03 + 0.37618890D+03 0.37448123D+03 0.37277626D+03 0.37107398D+03 + 0.36937436D+03 0.36767739D+03 0.36598306D+03 0.36429134D+03 + 0.36260221D+03 0.36091567D+03 0.35923168D+03 0.35755025D+03 + 0.35587134D+03 0.35419496D+03 0.35252109D+03 0.35084972D+03 + 0.34918083D+03 0.34751444D+03 0.34585052D+03 0.34418909D+03 + 0.34253013D+03 0.34087366D+03 0.33921967D+03 0.33756819D+03 + 0.33591921D+03 0.33427275D+03 0.33262882D+03 0.33098745D+03 + 0.32934866D+03 0.32771247D+03 0.32607890D+03 0.32444798D+03 + 0.32281976D+03 0.32119425D+03 0.31957150D+03 0.31795155D+03 + 0.31633443D+03 0.31472020D+03 0.31310889D+03 0.31150056D+03 + 0.30989526D+03 0.30829303D+03 0.30669393D+03 0.30509802D+03 + 0.30350534D+03 0.30191597D+03 0.30032995D+03 0.29874735D+03 + 0.29716823D+03 0.29559265D+03 0.29402066D+03 0.29245234D+03 + 0.29088775D+03 0.28932695D+03 0.28776999D+03 0.28621695D+03 + 0.28466789D+03 0.28312286D+03 0.28158193D+03 0.28004517D+03 + 0.27851262D+03 0.27698435D+03 0.27546042D+03 0.27394088D+03 + 0.27242579D+03 0.27091521D+03 0.26940918D+03 0.26790776D+03 + 0.26641099D+03 0.26491893D+03 0.26343163D+03 0.26194912D+03 + 0.26047146D+03 0.25899868D+03 0.25753082D+03 0.25606793D+03 + 0.25461004D+03 0.25315718D+03 0.25170939D+03 0.25026671D+03 + 0.24882915D+03 0.24739676D+03 0.24596956D+03 0.24454757D+03 + 0.24313083D+03 0.24171936D+03 0.24031317D+03 0.23891230D+03 + 0.23751677D+03 0.23612659D+03 0.23474178D+03 0.23336237D+03 + 0.23198838D+03 0.23061981D+03 0.22925669D+03 0.22789904D+03 + 0.22654688D+03 0.22520021D+03 0.22385905D+03 0.22252343D+03 + 0.22119335D+03 0.21986883D+03 0.21854989D+03 0.21723653D+03 + 0.21592878D+03 0.21462664D+03 0.21333013D+03 0.21203925D+03 + 0.21075402D+03 0.20947445D+03 0.20820056D+03 0.20693234D+03 + 0.20566980D+03 0.20441296D+03 0.20316182D+03 0.20191639D+03 + 0.20067666D+03 0.19944265D+03 0.19821435D+03 0.19699177D+03 + 0.19577491D+03 0.19456377D+03 0.19335834D+03 0.19215862D+03 + 0.19096462D+03 0.18977632D+03 0.18859372D+03 0.18741681D+03 + 0.18624558D+03 0.18508004D+03 0.18392016D+03 0.18276594D+03 + 0.18161738D+03 0.18047444D+03 0.17933714D+03 0.17820545D+03 + 0.17707935D+03 0.17595885D+03 0.17484392D+03 0.17373455D+03 + 0.17263072D+03 0.17153243D+03 0.17043965D+03 0.16935238D+03 + 0.16827059D+03 0.16719427D+03 0.16612340D+03 0.16505798D+03 + 0.16399798D+03 0.16294339D+03 0.16189419D+03 0.16085038D+03 + 0.15981192D+03 0.15877882D+03 0.15775105D+03 0.15672860D+03 + 0.15571145D+03 0.15469959D+03 0.15369301D+03 0.15269169D+03 + 0.15169562D+03 0.15070478D+03 0.14971916D+03 0.14873875D+03 + 0.14776353D+03 0.14679349D+03 0.14582862D+03 0.14486891D+03 + 0.14391433D+03 0.14296489D+03 0.14202057D+03 0.14108134D+03 + 0.14014722D+03 0.13921817D+03 0.13829419D+03 0.13737526D+03 + 0.13646139D+03 0.13555254D+03 0.13464871D+03 0.13374989D+03 + 0.13285607D+03 0.13196723D+03 0.13108336D+03 0.13020445D+03 + 0.12933048D+03 0.12846145D+03 0.12759735D+03 0.12673815D+03 + 0.12588384D+03 0.12503442D+03 0.12418987D+03 0.12335017D+03 + 0.12251531D+03 0.12168528D+03 0.12086007D+03 0.12003966D+03 + 0.11922403D+03 0.11841317D+03 0.11760707D+03 0.11680570D+03 + 0.11600907D+03 0.11521714D+03 0.11442990D+03 0.11364734D+03 + 0.11286945D+03 0.11209620D+03 0.11132757D+03 0.11056356D+03 + 0.10980414D+03 0.10904929D+03 0.10829901D+03 0.10755326D+03 + 0.10681204D+03 0.10607532D+03 0.10534309D+03 0.10461532D+03 + 0.10389201D+03 0.10317312D+03 0.10245865D+03 0.10174857D+03 + 0.10104286D+03 0.10034151D+03 0.99644492D+02 0.98951791D+02 + 0.98263386D+02 0.97579258D+02 0.96899389D+02 0.96223757D+02 + 0.95552345D+02 0.94885132D+02 0.94222099D+02 0.93563227D+02 + 0.92908497D+02 0.92257888D+02 0.91611382D+02 0.90968959D+02 + 0.90330600D+02 0.89696286D+02 0.89065998D+02 0.88439716D+02 + 0.87817422D+02 0.87199095D+02 0.86584719D+02 0.85974272D+02 + 0.85367736D+02 0.84765093D+02 0.84166323D+02 0.83571408D+02 + 0.82980329D+02 0.82393066D+02 0.81809601D+02 0.81229915D+02 + 0.80653989D+02 0.80081804D+02 0.79513341D+02 0.78948582D+02 + 0.78387508D+02 0.77830098D+02 0.77276335D+02 0.76726200D+02 + 0.76179672D+02 0.75636734D+02 0.75097366D+02 0.74561548D+02 + 0.74029262D+02 0.73500488D+02 0.72975207D+02 0.72453399D+02 + 0.71935045D+02 0.71420125D+02 0.70908620D+02 0.70400511D+02 + 0.69895777D+02 0.69394399D+02 0.68896357D+02 0.68401632D+02 + 0.67910204D+02 0.67422053D+02 0.66937160D+02 0.66455504D+02 + 0.65977065D+02 0.65501825D+02 0.65029763D+02 0.64560859D+02 + 0.64095094D+02 0.63632448D+02 0.63172901D+02 0.62716433D+02 + 0.62263025D+02 0.61812657D+02 0.61365309D+02 0.60920961D+02 + 0.60479595D+02 0.60041191D+02 0.59605728D+02 0.59173188D+02 + 0.58743552D+02 0.58316799D+02 0.57892912D+02 0.57471870D+02 + 0.57053654D+02 0.56638245D+02 0.56225625D+02 0.55815774D+02 + 0.55408674D+02 0.55004306D+02 0.54602707D+02 0.54203906D+02 + 0.53807885D+02 0.53414626D+02 0.53024111D+02 0.52636323D+02 + 0.52251245D+02 0.51868858D+02 0.51489146D+02 0.51112092D+02 + 0.50737678D+02 0.50365888D+02 0.49996704D+02 0.49630110D+02 + 0.49266089D+02 0.48904623D+02 0.48545698D+02 0.48189295D+02 + 0.47835399D+02 0.47483994D+02 0.47135062D+02 0.46788589D+02 + 0.46444557D+02 0.46102951D+02 0.45763755D+02 0.45426953D+02 + 0.45092530D+02 0.44760469D+02 0.44430755D+02 0.44103373D+02 + 0.43778307D+02 0.43455543D+02 0.43135064D+02 0.42816855D+02 + 0.42500903D+02 0.42187191D+02 0.41875705D+02 0.41566430D+02 + 0.41259351D+02 0.40954455D+02 0.40651726D+02 0.40351151D+02 + 0.40052714D+02 0.39756403D+02 0.39462202D+02 0.39170098D+02 + 0.38880078D+02 0.38592127D+02 0.38306232D+02 0.38022380D+02 + 0.37740557D+02 0.37460750D+02 0.37182946D+02 0.36907132D+02 + 0.36633295D+02 0.36361423D+02 0.36091503D+02 0.35823522D+02 + 0.35557468D+02 0.35293330D+02 0.35031093D+02 0.34770748D+02 + 0.34512282D+02 0.34255682D+02 0.34000938D+02 0.33748038D+02 + 0.33496970D+02 0.33247722D+02 0.33000285D+02 0.32754646D+02 + 0.32510795D+02 0.32268719D+02 0.32028409D+02 0.31789854D+02 + 0.31553042D+02 0.31317963D+02 0.31084606D+02 0.30852961D+02 + 0.30623016D+02 0.30394762D+02 0.30168187D+02 0.29943282D+02 + 0.29720035D+02 0.29498437D+02 0.29278477D+02 0.29060143D+02 + 0.28843427D+02 0.28628317D+02 0.28414804D+02 0.28202876D+02 + 0.27992524D+02 0.27783736D+02 0.27576504D+02 0.27370815D+02 + 0.27166660D+02 0.26964029D+02 0.26762911D+02 0.26563295D+02 + 0.26365172D+02 0.26168530D+02 0.25973360D+02 0.25779651D+02 + 0.25587393D+02 0.25396574D+02 0.25207186D+02 0.25019217D+02 + 0.24832658D+02 0.24647497D+02 0.24463724D+02 0.24281330D+02 + 0.24100303D+02 0.23920634D+02 0.23742313D+02 0.23565329D+02 + 0.23389671D+02 0.23215330D+02 0.23042297D+02 0.22870559D+02 + 0.22700109D+02 0.22530935D+02 0.22363028D+02 0.22196378D+02 + 0.22030975D+02 0.21866810D+02 0.21703873D+02 0.21542153D+02 + 0.21381643D+02 0.21222332D+02 0.21064211D+02 0.20907271D+02 + 0.20751502D+02 0.20596896D+02 0.20443443D+02 0.20291134D+02 + 0.20139961D+02 0.19989915D+02 0.19840987D+02 0.19693168D+02 + 0.19546451D+02 0.19400826D+02 0.19256286D+02 0.19112822D+02 + 0.18970426D+02 0.18829089D+02 0.18688805D+02 0.18549564D+02 + 0.18411360D+02 0.18274185D+02 0.18138030D+02 0.18002889D+02 + 0.17868753D+02 0.17735616D+02 0.17603470D+02 0.17472308D+02 + 0.17342123D+02 0.17212908D+02 0.17084655D+02 0.16957357D+02 + 0.16831008D+02 0.16705601D+02 0.16581129D+02 0.16457585D+02 + 0.16334963D+02 0.16213255D+02 0.16092455D+02 0.15972557D+02 + 0.15853553D+02 0.15735438D+02 0.15618205D+02 0.15501847D+02 + 0.15386357D+02 0.15271730D+02 0.15157958D+02 0.15045036D+02 + 0.14932955D+02 0.14821711D+02 0.14711296D+02 0.14601703D+02 + 0.14492926D+02 0.14384958D+02 0.14277793D+02 0.14171423D+02 + 0.14065842D+02 0.13961043D+02 0.13857019D+02 0.13753763D+02 + 0.13651269D+02 0.13549529D+02 0.13448537D+02 0.13348285D+02 + 0.13248768D+02 0.13149978D+02 0.13051908D+02 0.12954553D+02 + 0.12857906D+02 0.12761960D+02 0.12666709D+02 0.12572148D+02 + 0.12478271D+02 0.12385073D+02 0.12292548D+02 0.12200690D+02 + 0.12109497D+02 0.12018962D+02 0.11929082D+02 0.11839854D+02 + 0.11751272D+02 0.11663335D+02 0.11576039D+02 0.11489382D+02 + 0.11403361D+02 0.11317974D+02 0.11233220D+02 0.11149096D+02 + 0.11065602D+02 +END* diff --git a/source/KKRnano/regtests/run_test.sh b/source/KKRnano/regtests/run_test.sh index 02cfb37a9005361d93f7ba2f7ecf5a80be9a0971..117c9a1277429a052cdbe6bd15419a991e8859ec 100755 --- a/source/KKRnano/regtests/run_test.sh +++ b/source/KKRnano/regtests/run_test.sh @@ -1,6 +1,8 @@ #!/bin/sh ARCHIVE=loggs +export LD_LIBRARY_PATH=$MKLROOT/lib/intel64:$LD_LIBRARY_PATH + ## today's date, hour, minute day=`date "+%Y%m%d%H%M"` diff --git a/source/KKRnano/regtests/tests.py b/source/KKRnano/regtests/tests.py index 96d2a4386e54834b0ab57213c57915deee2c6e67..ede4da137b7696030b4fd4ae4c0e515ebfbfc278 100755 --- a/source/KKRnano/regtests/tests.py +++ b/source/KKRnano/regtests/tests.py @@ -12,7 +12,7 @@ TESTDIR = os.getcwd() ### perform the calculation in the current working directo DECIMALS = 6 ### 8=all digits, 6 should be enough DEFAULT_lmax = 3 DEFAULT_nranks = 1 -DEFAULT_nthreads = 1 +DEFAULT_nthreads = 4 direct = 4 ## iterative = 3 ## DEFAULT_solver = iterative @@ -21,36 +21,42 @@ ShowMD5 = True AllMPIs = 1 # 1=Yes, 0=No HighLmax = True testNocoSOC = True +verbose = False +MPIEXEC = 'mpirun' # 'srun' def run_it(cmd): """Run cmd, suppressing output. Returns output from stdout and exit code""" start_time = time.time() + if verbose: + print('Run command "{0}"'.format(cmd)) proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, close_fds=True, preexec_fn=os.setsid, shell=True) out, err = proc.communicate() end_time = time.time() tim = end_time - start_time - return out, proc.returncode, tim + return out.decode('utf-8'), proc.returncode, tim def get_energy(string): try: match = list(re.finditer(r"^.*TOTAL ENERGY in ryd. :(.*)$", string, re.M))[-1] # get last match only except: - print string + print(string) raise ArgumentError if match is not None: return float(match.group(1)) else: raise ArgumentError -def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=DEFAULT_solver, lmax=DEFAULT_lmax, Lly=DEFAULT_Lly): +def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=DEFAULT_solver, lmax=DEFAULT_lmax, Lly=DEFAULT_Lly, **kwargs): """Run KKR-calculation with input from 'inputdir' and returns the total energy""" - #print "start KKR for", inputdir, "with lmax=",lmax, ", solver=",solver, ", nthreads=",nthreads, "nranks=",nranks + if verbose: + print("start KKR for", inputdir, "with lmax=",lmax, ", solver=",solver, ", nthreads=",nthreads, "nranks=",nranks) + print('test dir:', TESTDIR) out, err, tim = run_it("./clearfiles.sh") global ShowMD5 if ShowMD5: out, err, tim = run_it("md5sum ./kkr.exe") - print out + print(out) ShowMD5 = False ## do not show again for file in glob.glob(os.path.join(inputdir, '*')): @@ -66,83 +72,111 @@ def KKRnano(inputdir, nranks=DEFAULT_nranks, nthreads=DEFAULT_nthreads, solver=D with open("input.conf", "a") as myfile: ## append to file myfile.write("LLY = {0}\n".format(int(Lly))) - out, err, tim = run_it("./kkr.exe --prepare") ### start from JM-formatted potential file + # add other inputs + for key, val in kwargs.items(): + with open("input.conf", "a") as myfile: ## append to file + myfile.write("{0} = {1}\n".format(key, val)) + + mpirun = '' + if MPIEXEC=='srun': + mpirun = 'srun -n 1 ' + out, err, tim = run_it(mpirun + "./kkr.exe --prepare") ### start from JM-formatted potential file ## execute the code - out, err, tim = run_it("OMP_STACKSIZE=80M OMP_NUM_THREADS={0} mpiexec -np {1} kkr.exe".format(int(nthreads), int(nranks))) + mpirun = 'mpirun -np' + if MPIEXEC=='srun': + mpirun = 'srun -n' + out, err, tim = run_it("OMP_STACKSIZE=80M OMP_NUM_THREADS={0} ".format(int(nthreads)) + mpirun + " {0} ./kkr.exe".format(int(nranks))) + if verbose: + print('out', out) + print('err', err) + print('tim', tim) ### grep the result total_energy = get_energy(out) - print "KKR for",inputdir," with lmax=",lmax," gives",total_energy,"Ryd", + msg = f"KKR for {inputdir} with lmax= {lmax} gives {total_energy} Ryd" if solver != DEFAULT_solver: - print ", solver=",solver, + msg += f", solver= {solver}" if nthreads != DEFAULT_nthreads: - print ", nthreads=",nthreads, + msg += f", nthreads= {nthreads}" if nranks != DEFAULT_nranks: - print ", nranks=",nranks, + msg += f", nranks= {nranks}" if Lly != DEFAULT_Lly: - print ", Lly=",Lly, - print " in", tim," sec" + msg += f", Lly={Lly}" + msg += f" in {tim} sec" + print(msg) out, err, tim = run_it("./clearfiles.sh") return total_energy +###################################################################################### + class Test_alloys(unittest.TestCase): def test_Fe8Co8(self): """Test random alloy of 16 atoms""" - Etot = -42561.17620828 + Etot = -42561.325157 for r in range(0, AllMPIs*4+1): # nranks=[1, 2, 4, 8, 16] self.assertAlmostEqual(KKRnano("Fe8Co8", solver=direct, nranks=2**r), Etot, DECIMALS) # about 30 seconds for nranks=1 + # total time ~2.2min class Test_copper(unittest.TestCase): def test_Cu4_lmax(self): """Test with high lmax. Works only with -heap-arrays on ifort, 4 Cu atoms in the cubic unit cell""" - Etot = -13219.36420827 + Etot = -13219.3620641 for r in range(0, AllMPIs*2+1): # nranks=[1, 2, 4] self.assertAlmostEqual(KKRnano("Cu4", solver=direct, nranks=2**r), Etot, DECIMALS) if HighLmax: - self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=4), -13219.71809004, DECIMALS) - self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=5), -13219.60358021, DECIMALS) # about 30 seconds - self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=6), -13219.5622359, DECIMALS) # about 60 seconds + self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=4, nranks=4), -13219.716163, DECIMALS) + self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=5, nranks=4), -13219.6016203, DECIMALS) # about 30 seconds + self.assertAlmostEqual(KKRnano("Cu4", solver=direct, lmax=6, nranks=4), -13219.5603038, DECIMALS) # about 60 seconds + # total time ~1.6min def test_Cu1_lmax(self): """Test with high lmax. Works only with -heap-arrays on ifort, 1 Cu atoms in the FCC unit cell""" - self.assertAlmostEqual(KKRnano("Cu1", solver=direct), -3308.16564382, DECIMALS) # about 2 seconds + self.assertAlmostEqual(KKRnano("Cu1", solver=direct, nranks=1), -3308.14107181, DECIMALS) # about 2 seconds if HighLmax: - self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=4), -3308.26672862, DECIMALS) # about 4 seconds - self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=5), -3308.23074153, DECIMALS) # about 8 seconds - self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=6), -3308.15897626, DECIMALS) # about 16 seconds + self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=4, nranks=1), -3308.26072261, DECIMALS) # about 4 seconds + self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=5, nranks=1), -3308.22046659, DECIMALS) # about 8 seconds + self.assertAlmostEqual(KKRnano("Cu1", solver=direct, lmax=6, nranks=1), -3308.15010032, DECIMALS) # about 16 seconds + # total time ~1min class Test_semiconductors(unittest.TestCase): def test_GaN(self): """Test semiconductor in zincblende structure with 2 vacancy cells""" - Etot = -3990.85752538 + Etot = -3990.8515006 for r in range(0, AllMPIs*2+1): # nranks=[4, 2, 1] self.assertAlmostEqual(KKRnano("GaN", solver=direct, nranks=2**(2-r)), Etot, DECIMALS) # about 80 seconds + # total time ~4.6min def test_Si(self): """Test semiconductor in diamond structure with 2 vacancy cells""" - Etot = -1155.68470407 + Etot = -1155.68952256 for r in range(0, AllMPIs*2+1): # nranks=[1, 2, 4] self.assertAlmostEqual(KKRnano("Si", solver=direct, nranks=2**r), Etot, DECIMALS) # about a minute - -# def test_ZnO(self): -# """Test semiconductor in wurzite structure with 4 vacancy cells and voro_weights""" -# Etot = -7405.77074357 ## test iterative solver (solver=3, default) without and with MPI -# for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8] -# self.assertAlmostEqual(KKRnano("ZnO", nranks=2**r), Etot, DECIMALS) -# -# Etot = -7405.77074351 -# for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8] -# self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=2**r), Etot, DECIMALS) -# ### Lloyd formula -# self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=8, Lly=1), -7405.74826372, DECIMALS) -# self.assertAlmostEqual(KKRnano("ZnO", nranks=8, Lly=1), -7405.74826372, DECIMALS) + # total time ~1.5min + + def test_ZnO(self): + """Test semiconductor in wurzite structure with 4 vacancy cells and voro_weights""" + Etot = -7405.77043939 ## test iterative solver (solver=3, default) without and with MPI + for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8] + self.assertAlmostEqual(KKRnano("ZnO", nranks=2**r), Etot, DECIMALS) + + for r in range(0, AllMPIs*3+1): # nranks=[1, 2, 4, 8] + self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=2**r), Etot, DECIMALS) + ### Lloyd formula + # broken because of error message "Lloyd's formula and num_local_atoms > 1 not supported." + # this seems to work only if we have one MPI rank per atom + # i.e. put "num_atom_procs = 8" into the input.conf + Etot = -7405.75215722 + self.assertAlmostEqual(KKRnano("ZnO", solver=direct, nranks=8, Lly=1, num_atom_procs=8), Etot, DECIMALS) + self.assertAlmostEqual(KKRnano("ZnO", nranks=8, Lly=1, num_atom_procs=8), Etot, DECIMALS) + # total time ~1.5min class Test_nocosocmaterials(unittest.TestCase): def test_MnGeB20(self): """Test chiral magnet MnGe B20 structure (8 atoms in unit cell)""" - Etot = -26017.23757851 + Etot = -26017.1505286 if testNocoSOC: - self.assertAlmostEqual(KKRnano("MnGeB20", solver=direct, nranks=8), Etot, DECIMALS) # takes longer than other tests + self.assertAlmostEqual(KKRnano("MnGeB20", solver=direct, nranks=8), Etot, DECIMALS) # takes longer than other tests, ~3 mins self.assertAlmostEqual(KKRnano("MnGeB20", solver=iterative, nranks=4), Etot, DECIMALS) # takes longer than other tests + # total time ~6min unittest.main() diff --git a/source/KKRnano/source/CalculationData_mod.F90 b/source/KKRnano/source/CalculationData_mod.F90 index 8d5cd9ad01db441b228bbcb3392937e43119bb8f..56d1adbaee85336c2635f4138a19594027b40d15 100644 --- a/source/KKRnano/source/CalculationData_mod.F90 +++ b/source/KKRnano/source/CalculationData_mod.F90 @@ -612,7 +612,7 @@ module CalculationData_mod call create(self%mesh_a(ila), irmd, ipand) - a_log_local = 0.025d0 + a_log_local = params%a_log b_log_local = inter_mesh%xrn(1)*params%alat / (exp(a_log_local * ((irmd-irid) - 1)) - 1.d0) call initRadialMesh(self=self%mesh_a(ila), alat=params%alat, xrn=inter_mesh%xrn, & diff --git a/source/KKRnano/source/DebugHelpers/DebugCheckArrayD_mod.f90 b/source/KKRnano/source/DebugHelpers/DebugCheckArrayD_mod.f90 deleted file mode 100644 index 283ab922187b4c4217e9f62b9914d7ff33a711c8..0000000000000000000000000000000000000000 --- a/source/KKRnano/source/DebugHelpers/DebugCheckArrayD_mod.f90 +++ /dev/null @@ -1,105 +0,0 @@ -! Author: Elias Rabel -module DebugCheckArrayD_mod - implicit none - public - - type DebugCheckArrayD - private - double precision, allocatable :: array_data(:) - integer :: num_elements - character(len=32) :: array_name - endtype - - contains - - subroutine createDebugCheckArrayD(self, array_to_check, num_elements, array_name) - type(DebugCheckArrayD), intent(inout) :: self - double precision, intent(in) :: array_to_check(num_elements) - integer, intent(in) :: num_elements - character(len=*), intent(in) :: array_name - - integer :: ii - - allocate(self%array_data(num_elements)) - - self%num_elements = num_elements - self%array_name = array_name - - do ii = 1, num_elements - self%array_data(ii) = array_to_check(ii) - enddo ! ii - - endsubroutine - - logical function testDebugCheckArrayD(self, array_to_check, fail_message) - type(DebugCheckArrayD), intent(in) :: self - double precision, intent(in) :: array_to_check(*) ! accept any array - character(len=*), intent(in), optional :: fail_message - - integer :: ii - - testDebugCheckArrayD = .false. - - do ii = 1, self%num_elements - if (self%array_data(ii) /= array_to_check(ii)) then - write(*,*) "testDebugCheckArrayD: Arrays do not match. Element ", ii - if (present(fail_message)) then - write(*,*) self%array_name, fail_message - else - write(*,*) self%array_name - endif - return - endif - enddo ! ii - - testDebugCheckArrayD = .true. - - endfunction - - elemental subroutine destroyDebugCheckArrayD(self) - type(DebugCheckArrayD), intent(inout) :: self - integer :: ist - deallocate(self%array_data, stat=ist) ! ignore status - endsubroutine ! destroy - -endmodule - -! -!program TryDebugCheckArrayD -! use DebugCheckArrayD_mod -! implicit none -! -! integer, parameter :: dimx = 10 -! integer, parameter :: dimy = 10 -! -! double precision, dimension(dimx, dimy) :: my_array -! -! integer :: x, y -! logical :: flag -! -! type(DebugCheckArrayD) :: db -! -! do y = 1, dimy -! do x = 1, dimx -! my_array(x,y) = x * y -! enddo -! enddo -! -! call createDebugCheckArrayD(db, my_array, dimx*dimy, "my_array") -! -! ! .. do something -! -! write(*,*) testDebugCheckArrayD(db, my_array) -! -! ! .. do something bad -! -! my_array(3,5) = -3 -! -! write(*,*) testDebugCheckArrayD(db, my_array) -! -! ! use optional fail_message -! write(*,*) testDebugCheckArrayD(db, my_array, fail_message="location: main") -! -! -! call destroyDebugCheckArrayD(db) -!endprogram diff --git a/source/KKRnano/source/DebugHelpers/DebugCheckArrayI_mod.f90 b/source/KKRnano/source/DebugHelpers/DebugCheckArrayI_mod.f90 deleted file mode 100644 index f49e6d8618cfd96dc9dc94719ebcec87ca7eb3d3..0000000000000000000000000000000000000000 --- a/source/KKRnano/source/DebugHelpers/DebugCheckArrayI_mod.f90 +++ /dev/null @@ -1,105 +0,0 @@ -! Author: Elias Rabel -module DebugCheckArrayI_mod - implicit none - public - - type DebugCheckArrayI - private - integer, allocatable :: array_data(:) - integer :: num_elements - character(len=32) :: array_name - endtype - - contains - - subroutine createDebugCheckArrayI(self, array_to_check, num_elements, array_name) - type(DebugCheckArrayI), intent(inout) :: self - integer, intent(in) :: array_to_check(num_elements) - integer, intent(in) :: num_elements - character(len=*), intent(in) :: array_name - - integer :: ii - - allocate(self%array_data(num_elements)) - - self%num_elements = num_elements - self%array_name = array_name - - do ii = 1, num_elements - self%array_data(ii) = array_to_check(ii) - enddo ! ii - - endsubroutine - - logical function testDebugCheckArrayI(self, array_to_check, fail_message) - type(DebugCheckArrayI), intent(in) :: self - integer, intent(in) :: array_to_check(*) ! accept any array - character(len=*), intent(in), optional :: fail_message - - integer :: ii - - testDebugCheckArrayI = .false. - - do ii = 1, self%num_elements - if (self%array_data(ii) /= array_to_check(ii)) then - write(*,*) "testDebugCheckArrayI: Arrays do not match. Element ", ii - if (present(fail_message)) then - write(*,*) self%array_name, fail_message - else - write(*,*) self%array_name - endif - return - endif - enddo ! ii - - testDebugCheckArrayI = .true. - - endfunction - - elemental subroutine destroyDebugCheckArrayI(self) - type(DebugCheckArrayI), intent(inout) :: self - integer :: ist - deallocate(self%array_data, stat=ist) ! ignore status - endsubroutine ! destroy - -endmodule - -! -!program TryDebugCheckArrayI -! use DebugCheckArrayI_mod -! implicit none -! -! integer, parameter :: dimx = 10 -! integer, parameter :: dimy = 10 -! -! integer, dimension(dimx, dimy) :: my_array -! -! integer :: x, y -! logical :: flag -! -! type(DebugCheckArrayI) :: db -! -! do y = 1, dimy -! do x = 1, dimx -! my_array(x,y) = x * y -! enddo -! enddo -! -! call createDebugCheckArrayI(db, my_array, dimx*dimy, "my_array") -! -! ! .. do something -! -! write(*,*) testDebugCheckArrayI(db, my_array) -! -! ! .. do something bad -! -! my_array(3,5) = -3 -! -! write(*,*) testDebugCheckArrayI(db, my_array) -! -! ! use optional fail_message -! write(*,*) testDebugCheckArrayI(db, my_array, fail_message="location: main") -! -! -! call destroyDebugCheckArrayI(db) -!endprogram diff --git a/source/KKRnano/source/DebugHelpers/DebugCheckArrayZ_mod.f90 b/source/KKRnano/source/DebugHelpers/DebugCheckArrayZ_mod.f90 deleted file mode 100644 index c076a3c2cb925f7a59ae36f7204ef60d4b9ca055..0000000000000000000000000000000000000000 --- a/source/KKRnano/source/DebugHelpers/DebugCheckArrayZ_mod.f90 +++ /dev/null @@ -1,105 +0,0 @@ -! Author: Elias Rabel -module DebugCheckArrayZ_mod - implicit none - public - - type DebugCheckArrayZ - private - double complex, allocatable :: array_data(:) - integer :: num_elements - character(len=32) :: array_name - endtype - - contains - - subroutine createDebugCheckArrayZ(self, array_to_check, num_elements, array_name) - type(DebugCheckArrayZ), intent(inout) :: self - double complex, intent(in) :: array_to_check(num_elements) - integer, intent(in) :: num_elements - character(len=*), intent(in) :: array_name - - integer :: ii - - allocate(self%array_data(num_elements)) - - self%num_elements = num_elements - self%array_name = array_name - - do ii = 1, num_elements - self%array_data(ii) = array_to_check(ii) - enddo ! ii - - endsubroutine - - logical function testDebugCheckArrayZ(self, array_to_check, fail_message) - type(DebugCheckArrayZ), intent(in) :: self - double complex, intent(in) :: array_to_check(*) ! accept any array - character(len=*), intent(in), optional :: fail_message - - integer :: ii - - testDebugCheckArrayZ = .false. - - do ii = 1, self%num_elements - if (self%array_data(ii) /= array_to_check(ii)) then - write(*,*) "testDebugCheckArrayZ: Arrays do not match. Element ", ii - if (present(fail_message)) then - write(*,*) self%array_name, fail_message - else - write(*,*) self%array_name - endif - return - endif - enddo ! ii - - testDebugCheckArrayZ = .true. - - endfunction - - elemental subroutine destroyDebugCheckArrayZ(self) - type(DebugCheckArrayZ), intent(inout) :: self - integer :: ist - deallocate(self%array_data, stat=ist) ! ignore status - endsubroutine ! destroy - -endmodule - - -!program TryDebugCheckArrayZ -! use DebugCheckArrayZ_mod -! implicit none -! -! integer, parameter :: dimx = 10 -! integer, parameter :: dimy = 10 -! -! double complex, dimension(dimx, dimy) :: my_array -! -! integer :: x, y -! logical :: flag -! -! type(DebugCheckArrayZ) :: db -! -! do y = 1, dimy -! do x = 1, dimx -! my_array(x,y) = x * y -! enddo -! enddo -! -! call createDebugCheckArrayZ(db, my_array, dimx*dimy, "my_array") -! -! ! .. do something -! -! write(*,*) testDebugCheckArrayZ(db, my_array) -! -! ! .. do something bad -! -! my_array(3,5) = -3 -! -! write(*,*) testDebugCheckArrayZ(db, my_array) -! -! ! use optional fail_message -! write(*,*) testDebugCheckArrayZ(db, my_array, fail_message="location: main") -! -! -! call destroyDebugCheckArrayZ(db) -!endprogram diff --git a/source/KKRnano/source/DebugHelpers/arraytest2_mod.F90 b/source/KKRnano/source/DebugHelpers/arraytest2_mod.F90 index 05ab311940925d14f45354a0cb4e7c3412493abc..d6931220049c23af25f6bc6e3e35d56b7c39a447 100755 --- a/source/KKRnano/source/DebugHelpers/arraytest2_mod.F90 +++ b/source/KKRnano/source/DebugHelpers/arraytest2_mod.F90 @@ -13,10 +13,6 @@ module arraytest2_mod module procedure ztest2d module procedure ztest3d module procedure ztest4d - - !module procedure itest1d - - ! repeat until 4d endinterface contains @@ -93,7 +89,7 @@ module arraytest2_mod double precision, intent(in) :: array(*) integer, intent(in) :: length - double precision, external :: DNRM2 + double precision, external :: DNRM2 ! from LAPACK ! print norm and average write(unit=str, fmt='(a7,i4,x,a16,x,e16.9,x,e16.9)') & @@ -106,12 +102,11 @@ module arraytest2_mod double complex, intent(in) :: array(*) integer, intent(in) :: length - double precision, external :: DZNRM2 + double precision, external :: DZNRM2 ! from LAPACK ! print norm and average write(unit=str, fmt='(a7,i4,x,a16,x,e12.5,x,e12.5,x,e12.5)') & "DEBUG: ", nr, msg, DZNRM2(length, array, 1), sum(array(1:length))/length - endfunction endmodule diff --git a/source/KKRnano/source/IterativeSolver/KKRmat_mod.F90 b/source/KKRnano/source/IterativeSolver/KKRmat_mod.F90 index 785b690e2b5b8cf63f30bd8dd54ffea237182ba2..6cabb140dd7bb928e4e5995f9377d20841cc8a97 100644 --- a/source/KKRnano/source/IterativeSolver/KKRmat_mod.F90 +++ b/source/KKRnano/source/IterativeSolver/KKRmat_mod.F90 @@ -219,6 +219,11 @@ module KKRmat_mod use fillKKRMatrix_mod, only: dump use IterativeSolver_mod, only: IterativeSolver, solve use DirectSolver_mod, only: DirectSolver, solve +#ifdef has_tfQMRgpu + use tfqmrgpu, only: tfqmrgpu_bsrsv_complete ! all-in-one GPU solver interface for rapid integration + use SolverStats_mod, only: reduce + use TimerMpi_mod, only: startTimer, stopTimer +#endif use SparseMatrixDescription_mod, only: dump use InitialGuess_mod, only: InitialGuess, load, store use KKROperator_mod, only: KKROperator @@ -257,6 +262,10 @@ module KKRmat_mod double complex, allocatable :: dPdE_local(:,:,:), gllke_x(:,:), dgde(:,:), MinvdMdE(:,:,:), TinvMinvdMdE(:,:,:) ! LLY double complex :: tracek ! LLY +#ifdef has_tfQMRgpu + integer (kind=4) :: o, ierr, iterations, lda + real (kind=8) :: residual +#endif integer :: num_trunc_atoms, lmsd, lm1, idx_lly, i1 double complex :: cfctorinv @@ -383,10 +392,38 @@ module KKRmat_mod ! store the initial guess call store(iguess_data, op%mat_X, ik=ikpoint, is=ispin, ie=ienergy) + case (5) ! GPU solver + +#ifdef has_tfQMRgpu + + o=0 + ierr=0 + + iterations = 2000 + residual = iterative_solver%qmrbound + lda = size(op%mat_A, 1) + call startTimer(kernel_timer) + ! write(*,*) "Written by us: ", size(op%bsr_X%ColIndex) + call tfqmrgpu_bsrsv_complete(op%bsr_A%nRows, lda, & + op%bsr_A%RowStart, op%bsr_A%ColIndex, op%mat_A(:,:,:,0), 't', & !! A (in) + op%bsr_X%RowStart, op%bsr_X%ColIndex, op%mat_X, 't', & !! X (out) + op%bsr_B%RowStart, op%bsr_B%ColIndex, op%mat_B, 't', & !! B (in) + iterations, residual, o, ierr) + call stopTimer(kernel_timer) + call reduce(iterative_solver%stats, iterations, residual, 0_8) + +#else + warn(6, "GPU solver needs -D has_tfQMRgpu (Problem is not solved) solver_type ="+solver_type) +#endif + case default warn(6, "No solver selected! Problem is not solved, solver_type ="+solver_type) endselect ! solver_type + !call dump(op%mat_X, "solution_form.dat", formatted=.true.) + !call dump(op%mat_B, "rhs_form.dat", formatted=.true.) + !stop __FILE__ + TESTARRAYLOG(3, op%mat_B) TESTARRAYLOG(3, op%mat_X) ! RESULT: mat_X diff --git a/source/KKRnano/source/IterativeSolver/fillKKRMatrix_mod.F90 b/source/KKRnano/source/IterativeSolver/fillKKRMatrix_mod.F90 index 745f05f02eacdd1fba5e36ca513a27659a70cc15..88ea971c0eda163bc5f8e31b8ed227acd3fd7c2e 100644 --- a/source/KKRnano/source/IterativeSolver/fillKKRMatrix_mod.F90 +++ b/source/KKRnano/source/IterativeSolver/fillKKRMatrix_mod.F90 @@ -32,7 +32,7 @@ module fillKKRMatrix_mod type(SparseMatrixDescription), intent(out) :: bsr_X integer(kind=1), intent(in) :: lmax_a(:,:) !< lmax of each interaction dim(naez_trc,num_local_atoms), -1: truncated - integer, parameter :: GROUPING = 0 ! -1:never, 0:auto, 1:always + integer, parameter :: GROUPING = -1 ! -1:never, 0:auto, 1:always integer :: iRow, jCol, Xind, nnzb, group nnzb = count(lmax_a >= 0) ! number of non-zero blocks in X @@ -46,7 +46,7 @@ module fillKKRMatrix_mod endif if (group > 0) then - + !write(*,*) "we are in group > 0" call create(bsr_X, nRows=size(lmax_a, 1), nnzb=size(lmax_a, 1), nCols=1) ! generate BSR descriptor of a flat structure, fuse RHS atoms into rectangular blocks diff --git a/source/KKRnano/source/KKRnano.F90 b/source/KKRnano/source/KKRnano.F90 index e498678a0c9cfe31bbed4ab4b83bda234eb8e8f3..4118a7ec29be4448e5e263f96714714d35ff7194 100644 --- a/source/KKRnano/source/KKRnano.F90 +++ b/source/KKRnano/source/KKRnano.F90 @@ -268,7 +268,7 @@ program KKRnano enddo ! ila ! Core relaxation - only mastergroup needs results - if (mp%isInMasterGroup) then + if (mp%isInMasterGroup.and.params%npol /= 0) then ! Not threadsafe: intcor, intin, intout have a save statement ebot = emesh%E1; if (any(params%npntsemi > 0)) ebot = emesh%EBOTSEMI !!!$omp parallel do private(ila, atomdata) diff --git a/source/KKRnano/source/Makefile b/source/KKRnano/source/Makefile index 05f24378b49a2573248c06bd1cc8a685956098c8..759599018256f3db8ce4be073e6212a3ee2950a6 100644 --- a/source/KKRnano/source/Makefile +++ b/source/KKRnano/source/Makefile @@ -10,13 +10,26 @@ SMP ?= none PROGRAM = kkr.exe # Path to put object files and module files -BUILDDIR = $(HOME)/build +BUILDDIR = ./build + +EXTRA_FLAGS ?= + +### can we make use of the tfQMRgpu library? +tfQMRgpu ?= no +ifeq ($(tfQMRgpu),yes) + EXTRA_FLAGS += -D has_tfQMRgpu + TFQMRGPU_PATH = $(HOME)/tfQMRgpu +endif + -EXTRA_FLAGS = FC90FLAGS = FCFLAGS = PPFLAGS = PPFLAGS += -D USE_VOROWEIGHTS +ifeq ($(TYPE),debug) + PPFLAGS += -D DEBUG +endif +# PPFLAGS += -D NDEBUG # PPFLAGS += -D BENCHMARK_tfQMR # PPFLAGS += -D EXPORT_tfQMR_PROBLEM @@ -24,7 +37,6 @@ PPFLAGS += -D USE_VOROWEIGHTS # PPFLAGS += -D TRANSPOSE_TO_ROW_MAJOR ### TRANSPOSE_TO_ROW_MAJOR seems to work, however, there was a bug in col_norms about the non-linearity of DZNRM2, so we have to see which references went wrong #PPFLAGS += -D SUPERCELL_ELECTROSTATICS=8 -# -D NDEBUG LDFLAGS = # ========= IFF Workstations ============ @@ -33,9 +45,9 @@ ifeq ($(PLATFORM),ifort) FC = mpiifort -warn all FC90 = mpiifort -warn all # -module <path> specifies where to put .mod files - ifeq ($(SMP),openmp) - FCFLAGS += -qopenmp - endif + ifeq ($(SMP),openmp) + FCFLAGS += -qopenmp + endif FCFLAGS += -module $(BUILDDIR) FCFLAGS += -I $(BUILDDIR) # PPFLAGS += -D TASKLOCAL_FILES @@ -53,7 +65,7 @@ ifeq ($(PLATFORM),ifort) FCFLAGS += -O0 -g -check bounds -traceback -debug all -check all PPFLAGS += -D USE_MTRADII -D USE_OLD_MESH -D NOLOGGING else ifeq ($(TYPE),voronoi_mesh) - FCFLAGS += -O2 -xHost + FCFLAGS += -O2 PPFLAGS += -D NOLOGGING -D USE_OLD_MESH else ifeq ($(TYPE),voronoi_mesh_debug) FCFLAGS += -O0 -g -check bounds -traceback -debug all -check all -fpe1 @@ -64,9 +76,8 @@ ifeq ($(PLATFORM),ifort) else ifeq ($(TYPE),voronoi_mesh_print_mtradii) FCFLAGS += -O0 -g PPFLAGS += -D NOLOGGING -D USE_OLD_MESH -D PRINT_MTRADII - else - FCFLAGS += -O2 -xHost + FCFLAGS += -O2 PPFLAGS += -D NOLOGGING endif endif @@ -91,12 +102,14 @@ ifeq ($(PLATFORM),gfortran) FC90FLAGS = -ffree-line-length-0 PPFLAGS += -D NOLOGGING # FCFLAGS += -D TASKLOCAL_FILES ### breaks when TASKLOCAL_FILES is used - LDFLAGS += -L /usr/local/atlas/lib -llapack -lf77blas -lcblas -latlas +# LDFLAGS += -L /usr/local/atlas/lib -llapack -latlas + LDFLAGS += -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 ###-lpthread +# # LDFLAGS += -lgfortran + ### -lf77blas -lcblas -latlas endif # ================== JURECA ====================== -# optimal setup on one node seems to be 8MPI/3OMP for 64 atoms # The following software stages were tested and work: # module --force purge # module use /usr/local/software/jureca/OtherStages @@ -112,21 +125,21 @@ ifeq ($(PLATFORM),jureca) FCFLAGS += -module $(BUILDDIR) FCFLAGS += -I $(BUILDDIR) # PPFLAGS += -D TASKLOCAL_FILES - FCFLAGS += -g + FCFLAGS += -g -march=core-avx2 LDFLAGS += -g -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread -lm -ldl ifeq ($(TYPE),debug_light) FCFLAGS += -O0 -g else ifeq ($(TYPE),debug) FCFLAGS += -O0 -g -check bounds -traceback -debug all -check all -fpe1 else ifeq ($(TYPE),mtradii) - FCFLAGS += -O2 -xHost + FCFLAGS += -O2 PPFLAGS += -D USE_MTRADII PPFLAGS += -D NOLOGGING -D USE_OLD_MESH else ifeq ($(TYPE),debug_mtradii) FCFLAGS += -O0 -g -check bounds -traceback -debug all -check all PPFLAGS += -D USE_MTRADII else ifeq ($(TYPE),voronoi_mesh) - FCFLAGS += -O2 -xHost + FCFLAGS += -O2 PPFLAGS += -D NOLOGGING -D USE_OLD_MESH else ifeq ($(TYPE),voronoi_mesh_debug) FCFLAGS += -O0 -g -check bounds -traceback -debug all -check all -fpe1 @@ -135,7 +148,7 @@ ifeq ($(PLATFORM),jureca) FCFLAGS += -O0 -g PPFLAGS += -D NOLOGGING -D USE_OLD_MESH else - FCFLAGS += -O2 -xHost + FCFLAGS += -O2 PPFLAGS += -D NOLOGGING endif endif @@ -184,14 +197,14 @@ ifeq ($(PLATFORM),jureca_knl) PPFLAGS += -D NOLOGGING endif endif -# ================== HAZEL HEN ====================== +# ================== HAWK =========================== # Usage of Intel compiler and Intel MKL seems to give best results: # module swap PrgEnv-cray PrgEnv-intel # module unload cray-libsci # Remarks: - Bad GGA performance -> Use LDA! # - Home directory slow -> Use Workspace (see HLRS wiki) # - If 'seg 0' error occurs, add 'module unload craype-hugepages16M' to job file -ifeq ($(PLATFORM),hazelhen) +ifeq ($(PLATFORM),hawk) FC = ftn FC90 = ftn # -module <path> specifies where to put .mod files @@ -307,7 +320,7 @@ PPFLAGS = -WF,-DUSE_VOROWEIGHTS -WF,-DCOMPUTE_tref_LOCALLY -WF,-DNOLOGGING ifeq ($(SMP),openmp) FCFLAGS += -qsmp=omp - PPFLAGS += -WF,-DCPP_hybrid + PPFLAGS += -WF,-DCPP_hybrid endif #ESSL @@ -317,16 +330,16 @@ endif LDFLAGS = -L/bgsys/local/lib -lesslsmpbg -L/opt/ibmcmp/xlsmp/3.1/bglib64 -lxlsmp -L/bgsys/local/fftw3/3.3.2/fftw_g/lib/ -lfftw3 ifeq ($(TYPE),debug) - FCFLAGS += -q64 -O0 -qstrict -g -qnosave -C -qinitauto=7FF7FFFF -WF,-DDEBUG1 + FCFLAGS += -q64 -O0 -qstrict -g -qnosave -C -qinitauto=7FF7FFFF -WF,-DDEBUG1 else ifeq ($(TYPE),scorep) - FC = scorep mpixlf77_r - FC90 = scorep mpixlf90_r - FCFLAGS += -q64 -O3 -qstrict + FC = scorep mpixlf77_r + FC90 = scorep mpixlf90_r + FCFLAGS += -q64 -O3 -qstrict else ifeq ($(TYPE),voronoi_mesh) - FCFLAGS += -q64 -O3 -qstrict - PPFLAGS += -WF,-DUSE_OLD_MESH + FCFLAGS += -q64 -O3 -qstrict + PPFLAGS += -WF,-DUSE_OLD_MESH else - FCFLAGS += -q64 -O3 -qstrict + FCFLAGS += -q64 -O3 -qstrict endif #ifeq ($(USETOOL),scalasca) @@ -368,18 +381,33 @@ SRCS = $(foreach DIR,$(DIRS),$(wildcard $(DIR)/*.f)) SRCS90 = $(foreach DIR,$(DIRS),$(wildcard $(DIR)/*.f90)) SRCSFPP = $(foreach DIR,$(DIRS),$(wildcard $(DIR)/*.F)) SRCS90FPP = $(foreach DIR,$(DIRS),$(wildcard $(DIR)/*.F90)) +SRCS95TMPL = $(foreach DIR,$(DIRS),$(wildcard $(DIR)/*.F95)) + + +OBJS= + +ifeq ($(tfQMRgpu),yes) + LDFLAGS += -L$(TFQMRGPU_PATH)/lib64 -ltfQMRgpu_Fortran -ltfQMRgpu + OBJS += tfQMRgpu_mod.o +endif + + +LINKER= $(FC90) + # notdir extracts only filename -OBJS = $(notdir ${SRCS:.f=.o}) +OBJS += $(notdir ${SRCS:.f=.o}) OBJS += $(notdir ${SRCS90:.f90=.o}) OBJS += $(notdir ${SRCSFPP:.F=.o}) OBJS += $(notdir ${SRCS90FPP:.F90=.o}) +OBJS += $(notdir ${SRCS95TMPL:.F95=.o}) + .PHONY: all all: $(PROGRAM) $(PROGRAM): $(OBJS) - $(FC90) $(FCFLAGS) -o $(PROGRAM) $(addprefix $(BUILDDIR)/,$(OBJS)) $(LDFLAGS) + $(LINKER) -o $(PROGRAM) $(addprefix $(BUILDDIR)/,$(OBJS)) $(LDFLAGS) %.o: %.f $(FC) $(FCFLAGS) $(EXTRA_FLAGS) -c $< -o $(BUILDDIR)/$@ @@ -387,17 +415,28 @@ $(PROGRAM): $(OBJS) %.o: %.f90 $(FC90) $(FCFLAGS) $(EXTRA_FLAGS) $(FC90FLAGS) -c $< -o $(BUILDDIR)/$@ -%.o: %.f95 - $(FC90) $(FCFLAGS) $(EXTRA_FLAGS) $(FC90FLAGS) -c $< -o $(BUILDDIR)/$@ - %.o: %.F $(FC) $(FCFLAGS) $(EXTRA_FLAGS) $(PPFLAGS) $(PPFLAGS) -c $< -o $(BUILDDIR)/$@ %.o: %.F90 $(FC90) $(FCFLAGS) $(EXTRA_FLAGS) $(FC90FLAGS) $(PPFLAGS) -c $< -o $(BUILDDIR)/$@ +ifeq ($(tfQMRgpu),yes) +# add a target tfQMRgpu +tfQMRgpu: $(TFQMRGPU_PATH)/example/tfqmrgpu_Fortran_example.F90 + $(FC90) -I $(TFQMRGPU_PATH)/tfQMRgpu/include $(FCFLAGS) $(EXTRA_FLAGS) \ + $(FC90FLAGS) $(PPFLAGS) -c $< -o $(BUILDDIR)/tfQMRgpu_mod.o +endif + + +### Fortran-templates: %.o: %.F95 - $(FC90) $(FCFLAGS) $(EXTRA_FLAGS) $(FC90FLAGS) $(PPFLAGS) -c $< -o $(BUILDDIR)/$@ + sed -e 's/_TYPE/D/' $< > $(BUILDDIR)/$*.F90 + sed -e 's/_TYPE/C/' $< >> $(BUILDDIR)/$*.F90 + sed -e 's/_TYPE/Z/' $< >> $(BUILDDIR)/$*.F90 + sed -e 's/_TYPE/I/' $< >> $(BUILDDIR)/$*.F90 + $(FC90) $(FCFLAGS) $(EXTRA_FLAGS) $(FC90FLAGS) $(PPFLAGS) -c $(BUILDDIR)/$*.F90 -o $(BUILDDIR)/$@ + .PHONY: clean clean: rm -f $(BUILDDIR)/*.o @@ -407,45 +446,50 @@ clean: .PHONY: test test: - @echo $(SRCS) - @echo $(SRCS90) @echo $(OBJS) @echo $(VPATH) + @echo $(SRCS90FPP) .PHONY: depend depend: $(SRCS90) makedepend +ifeq ($(tfQMRgpu),yes) + # manually add a dependency + KKRmat_mod.o: tfQMRgpu_mod.o +endif + + #======================== Module dependencies ======================================== KKRnano.o: Logging_mod.o KKRzero_mod.o PotentialConverter_mod.o KKRnanoParallel_mod.o BasisAtom_mod.o AtomicCore_mod.o RadialMeshData_mod.o main2_aux_mod.o ScatteringCalculation_mod.o Main2Arrays_mod.o KKRnano_Comm_mod.o ProcessKKRresults_mod.o InputParams_mod.o EBalanceHandler_mod.o LDAUData_mod.o TimerMpi_mod.o EnergyMesh_mod.o DimParams_mod.o CalculationData_mod.o TruncationZone_mod.o: Main2Arrays_mod.o -KKRmat_mod.o: ExchangeTable_mod.o two_sided_commZ_mod.o arraytest2_mod.o Logging_mod.o TimerMpi_mod.o KKROperator_mod.o one_sided_commZ_mod.o ClusterInfo_mod.o IterativeSolver_mod.o jij_calc_mod.o Truncation_mod.o SparseMatrixDescription_mod.o BCPOperator_mod.o SolverStats_mod.o InitialGuess_mod.o fillKKRMatrix_mod.o DirectSolver_mod.o +KKRmat_mod.o: ExchangeTable_mod.o two_sided_comm_mod.o arraytest2_mod.o Logging_mod.o TimerMpi_mod.o KKROperator_mod.o one_sided_comm_mod.o ClusterInfo_mod.o IterativeSolver_mod.o jij_calc_mod.o Truncation_mod.o SparseMatrixDescription_mod.o BCPOperator_mod.o SolverStats_mod.o InitialGuess_mod.o fillKKRMatrix_mod.o DirectSolver_mod.o ProcessKKRresults_mod.o: arraytest2_mod.o KKRnanoParallel_mod.o AtomicForce_mod.o Logging_mod.o Lloyds_formula_mod.o wrappers_mod.o brydbm_new_com_mod.o Main2Arrays_mod.o ShapefunData_mod.o EnergyResults_mod.o LDAUData_mod.o ShapeGauntCoefficients_mod.o GauntCoefficients_mod.o CalculationData_mod.o muffin_tin_zero_mod.o RadialMeshData_mod.o MadelungPotential_mod.o broyden_kkr_mod.o EnergyMesh_mod.o BasisAtom_mod.o DensityResults_mod.o Lloyd0_new_mod.o KKRresults_mod.o InputParams_mod.o TimerMpi_mod.o DimParams_mod.o BroydenData_mod.o NearField_calc_mod.o debug_morgan_mod.o total_energy_mod.o NearField_kkr_mod.o: Constants_mod.o NearField_calc_mod.o: RadialMeshData_mod.o NearField_com_mod.o BasisAtom_mod.o CalculationData_mod.o NearField_mod.o: Harmonics_mod.o MadelungCalculator_mod.o Constants_mod.o NearField_kkr_mod.o -KKRnano_Comm_mod.o: KKRnanoParallel_mod.o jij_calc_mod.o comm_patternsD_mod.o comm_patternsZ_mod.o comm_patternsC_mod.o Exceptions_mod.o +KKRnano_Comm_mod.o: KKRnanoParallel_mod.o jij_calc_mod.o comm_patterns_mod.o Exceptions_mod.o InputParams_mod.o: ConfigReader_mod.o PolygonFaces_mod.o: Constants_mod.o ShapeGeometryHelpers_mod.o: Exceptions_mod.o Constants_mod.o ShapeStandardMesh_mod.o: Exceptions_mod.o Constants_mod.o wrappers_mod.o: Warnings_mod.o ValenceDensity_mod.o SingleSite_mod.o BasisAtom_mod.o RadialMeshData_mod.o ShapefunData_mod.o EnergyMesh_mod.o LDAUData_mod.o ShapeGauntCoefficients_mod.o GauntCoefficients_mod.o NonCollinearMagnetism_mod.o ##AtomicCore_mod.o -BCPOperator_mod.o: ClusterInfo_mod.o Exceptions_mod.o +BCPOperator_mod.o: ClusterInfo_mod.o Exceptions_mod.o CalculationData_mod.o: Exceptions_mod.o ExchangeTable_mod.o KKRnanoParallel_mod.o JelliumPotentials_mod.o LatticeVectors_mod.o TruncationZone_mod.o Main2Arrays_mod.o EnergyResults_mod.o LDAUData_mod.o ShapeGauntCoefficients_mod.o GauntCoefficients_mod.o InitialGuess_mod.o MadelungCalculator_mod.o RadialMeshData_mod.o ConstructShapes_mod.o InterpolateBasisAtom_mod.o BasisAtom_mod.o ShapefunData_mod.o DensityResults_mod.o KKRresults_mod.o InputParams_mod.o RefCluster_mod.o DimParams_mod.o ClusterInfo_mod.o BroydenData_mod.o JijData_mod.o Truncation_mod.o ChebMeshData_mod.o NonCollinearMagnetismData_mod.o -NearField_com_mod.o: Logging_mod.o one_sided_commD_mod.o NearField_mod.o MadelungCalculator_mod.o NearField_kkr_mod.o +NearField_com_mod.o: Logging_mod.o one_sided_comm_mod.o NearField_mod.o MadelungCalculator_mod.o NearField_kkr_mod.o ShapeIntegrationHelpers_mod.o: Constants_mod.o ConstructShapes_mod.o: RefCluster_mod.o ShapefunData_mod.o Voronoi_mod.o ShapeFunctions_mod.o LatticeVectors_mod.o EnergyMesh_mod.o: EnergyMeshHelpers_mod.o InterpolateBasisAtom_mod.o: RadialMeshData_mod.o BasisAtom_mod.o PotentialData_mod.o AtomicCoreData_mod.o SingleSiteRef_mod.o: Harmonics_mod.o kkr_helpers_mod.o SingleSiteHelpers_mod.o Exceptions_mod.o -IterativeSolver_mod.o: tfQMR_mod.o SolverStats_mod.o TimerMpi_mod.o +IterativeSolver_mod.o: tfQMR_mod.o SolverStats_mod.o TimerMpi_mod.o kloopz1_mod.o: KKROperator_mod.o ClusterInfo_mod.o BCPOperator_mod.o KKRmat_mod.o jij_calc_mod.o IterativeSolver_mod.o InitialGuess_mod.o Constants_mod.o TimerMpi_mod.o -ShapeCriticalPoints_mod.o: Constants_mod.o ShapeGeometryHelpers_mod.o PolygonFaces_mod.o +ShapeCriticalPoints_mod.o: Constants_mod.o ShapeGeometryHelpers_mod.o PolygonFaces_mod.o MadelungPotential_mod.o: BasisAtom_mod.o MadelungCalculator_mod.o RadialMeshData_mod.o DensityResults_mod.o EnergyResults_mod.o CalculationData_mod.o EBalanceHandler_mod.o: KKRnanoParallel_mod.o Exceptions_mod.o -ShapeIntegration_mod.o: ShapeIntegrationHelpers_mod.o Constants_mod.o PolygonFaces_mod.o +ShapeIntegration_mod.o: ShapeIntegrationHelpers_mod.o Constants_mod.o PolygonFaces_mod.o BasisAtom_mod.o: Exceptions_mod.o RadialMeshData_mod.o ShapefunData_mod.o PotentialData_mod.o AtomicCoreData_mod.o ChebMeshData_mod.o tfQMR_mod.o: Logging_mod.o SolverStats_mod.o KKROperator_mod.o BCPOperator_mod.o TimerMpi_mod.o KKRresults_mod.o: DimParams_mod.o @@ -459,8 +503,8 @@ ShapeFunctions_mod.o: PolygonFaces_mod.o ShapeCriticalPoints_mod.o Constants_mod ConfigReader_mod.o: ConfigReaderDictionary_mod.o KKROperator_mod.o: Truncation_mod.o ClusterInfo_mod.o fillKKRMatrix_mod.o SparseMatrixDescription_mod.o bsrmm_mod.o Lloyd0_new_mod.o: BasisAtom_mod.o RadialMeshData_mod.o ShapefunData_mod.o EnergyMesh_mod.o LDAUData_mod.o GauntCoefficients_mod.o ValenceDensity_mod.o -ClusterInfo_mod.o: Statistics_mod.o TruncationZone_mod.o RefCluster_mod.o two_sided_commI_mod.o ExchangeTable_mod.o -ScatteringCalculation_mod.o: KKRnanoParallel_mod.o one_sided_commD_mod.o Constants_mod.o SingleSiteRef_mod.o arraytest2_mod.o Logging_mod.o InputParams_mod.o TruncationZone_mod.o wrappers_mod.o Main2Arrays_mod.o KKRnano_Comm_mod.o jij_calc_mod.o BCPOperator_mod.o LDAUData_mod.o one_sided_commZ_mod.o GauntCoefficients_mod.o InitialGuess_mod.o CalculationData_mod.o EBalanceHandler_mod.o EnergyMesh_mod.o KKROperator_mod.o BasisAtom_mod.o KKRresults_mod.o IterativeSolver_mod.o RefCluster_mod.o TimerMpi_mod.o DimParams_mod.o kloopz1_mod.o ClusterInfo_mod.o JijData_mod.o Truncation_mod.o two_sided_commD_mod.o ChebMeshData_mod.o NonCollinearMagnetism_mod.o +ClusterInfo_mod.o: Statistics_mod.o TruncationZone_mod.o RefCluster_mod.o two_sided_comm_mod.o ExchangeTable_mod.o +ScatteringCalculation_mod.o: KKRnanoParallel_mod.o Constants_mod.o SingleSiteRef_mod.o arraytest2_mod.o Logging_mod.o InputParams_mod.o TruncationZone_mod.o wrappers_mod.o Main2Arrays_mod.o KKRnano_Comm_mod.o jij_calc_mod.o BCPOperator_mod.o LDAUData_mod.o one_sided_comm_mod.o GauntCoefficients_mod.o InitialGuess_mod.o CalculationData_mod.o EBalanceHandler_mod.o EnergyMesh_mod.o KKROperator_mod.o BasisAtom_mod.o KKRresults_mod.o IterativeSolver_mod.o RefCluster_mod.o TimerMpi_mod.o DimParams_mod.o kloopz1_mod.o ClusterInfo_mod.o JijData_mod.o Truncation_mod.o two_sided_comm_mod.o ChebMeshData_mod.o NonCollinearMagnetism_mod.o total_energy_mod.o: Quadrature_mod.o BasisAtom_mod.o RadialMeshData_mod.o ShapefunData_mod.o ShapeGauntCoefficients_mod.o vxcgga.o: XCFunctionals_mod.o KKRzero_mod.o: Exceptions_mod.o BrillouinZoneMesh_mod.o PositionReader_mod.o MadelungCalculator_mod.o Startb1_mod.o EnergyMesh_mod.o EnergyMeshHelpers_mod.o Lattice_mod.o BrillouinZone_mod.o ConfigReader_mod.o ConfigReaderDictionary_mod.o InputParams_mod.o Main2Arrays_mod.o DimParams_mod.o BasisAtom_mod.o ShapefunData_mod.o PotentialData_mod.o AtomicCoreData_mod.o RadialMeshData_mod.o ShapefunData_mod.o read_formatted_mod.o read_formatted_shapefun_mod.o ldauinfo_read.o ldaustart.o @@ -494,9 +538,6 @@ EnergyMeshHelpers_mod.o: GaussWeights_mod.o Constants_mod.o jij_calc_mod.o: Sorting_mod.o PotentialConverter_mod.o: DimParams_mod.o BasisAtom_mod.o RadialMeshData_mod.o PotentialData_mod.o Startb1_mod.o: RadialMeshData_mod.o BasisAtom_mod.o read_formatted_mod.o read_formatted_shapefun_mod.o InputParams_mod.o ChebMeshData_mod.o -one_sided_commZ_mod.o: ChunkIndex_mod.o -one_sided_commI_mod.o: ChunkIndex_mod.o -one_sided_commD_mod.o: ChunkIndex_mod.o RadialMeshData_mod.o: Exceptions_mod.o read_formatted_mod.o: Exceptions_mod.o BrillouinZone_mod.o: Exceptions_mod.o BrillouinZoneMesh_mod.o @@ -513,15 +554,15 @@ AtomicCore_mod.o: Exceptions_mod.o Quadrature_mod.o Constants_mod.o JelliumPotentials_mod.o: Exceptions_mod.o DirectSolver_mod.o: Exceptions_mod.o KKROperator_mod.o fillKKRMatrix_mod.o ExchangeTable_mod.o: ChunkIndex_mod.o -two_sided_commZ_mod.o: ExchangeTable_mod.o -two_sided_commD_mod.o: ExchangeTable_mod.o -two_sided_commI_mod.o: ExchangeTable_mod.o +one_sided_comm_mod.o: ChunkIndex_mod.o +two_sided_comm_mod.o: ExchangeTable_mod.o LocalAtomData_mod.o: Exceptions_mod.o RadialMeshData_mod.o ShapefunData_mod.o BasisAtom_mod.o LDAUData_mod.o JijData_mod.o RefCluster_mod.o MadelungCalculator_mod.o DensityResults_mod.o EnergyResults_mod.o KKRresults_mod.o bsrmm_mod.o: CacheOverlap_mod.o CacheOverlap_mod.o: ChebMeshData_mod.o: InputParams_mod.o RadialMeshData_mod.o Truncation_mod.o: Logging_mod.o Exceptions_mod.o TruncationZone_mod.o -NonCollinearMagnetism_mod.o: RadialMeshData_mod.o ChebMeshData_mod.o +NonCollinearMagnetism_mod.o: RadialMeshData_mod.o ChebMeshData_mod.o read_formatted_shapefun_mod.o NonCollinearMagnetismData_mod.o: Exceptions_mod.o +vintras_new.o: SingleSiteHelpers_mod.o # DO NOT DELETE diff --git a/source/KKRnano/source/NonCollinearMagnetism_mod.F90 b/source/KKRnano/source/NonCollinearMagnetism_mod.F90 index fea34a3c32be41a9a1a5bb85c5482b96930e077f..aca2580fe50037e13b8d361ce68e6c7ad21f246f 100644 --- a/source/KKRnano/source/NonCollinearMagnetism_mod.F90 +++ b/source/KKRnano/source/NonCollinearMagnetism_mod.F90 @@ -12,7 +12,7 @@ module NonCollinearMagnetism_mod !> ToDo: adopt coding style to real F90 !------------------------------------------------------------------------------- use RadialMeshData_mod!, only: -use ChebMeshData_mod!, only: +use ChebMeshData_mod!, only implicit none private @@ -22,2807 +22,2678 @@ public :: rotatematrix contains -SUBROUTINE drvbastrans(rc,crel,rrel,srrel,nrrel,irrel, & - nlmax,nkmmax,nmuemax,nkmpmax,nkmax,linmax) -! ******************************************************************** -! * * -! * * -! ******************************************************************** -IMPLICIT REAL*8(a-h,o-z) +SUBROUTINE tmat_newsolver(ie,nspin,lmax,zat,socscale, & + ez,nsra,cleb,icleb,iend,ncheb,npan_tot, & + rpan_intervall,ipan_intervall, & + rnew,vinsnew,theta,phi,ipot, & + ! lly, & + lmpotd,irmd_new,TmatN,soc,enable_quad_prec) ! new input parameters + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-18 Time: 14:58:02 + +IMPLICIT NONE -COMPLEX*16, INTENT(IN OUT) :: rc(nkmmax,nkmmax) -COMPLEX*16, INTENT(IN OUT) :: crel(nkmmax,nkmmax) -COMPLEX*16, INTENT(IN OUT) :: rrel(nkmmax,nkmmax) -COMPLEX*16, INTENT(IN OUT) :: srrel(2,2,nkmmax) -INTEGER, INTENT(IN OUT) :: nrrel(2,nkmmax) -INTEGER, INTENT(IN OUT) :: irrel(2,2,nkmmax) -INTEGER, INTENT(IN) :: nlmax -INTEGER, INTENT(IN) :: nkmmax -INTEGER, INTENT(IN) :: nmuemax -INTEGER, INTENT(IN) :: nkmpmax -INTEGER, INTENT(IN) :: nkmax -INTEGER, INTENT(IN) :: linmax +INTEGER, INTENT(IN) :: ie +INTEGER, INTENT(IN) :: nspin +INTEGER, INTENT(IN) :: lmax +DOUBLE PRECISION, INTENT(IN) :: zat +DOUBLE PRECISION, INTENT(IN) :: socscale +DOUBLE COMPLEX, INTENT(IN) :: ez(:) +INTEGER, INTENT(IN) :: nsra +DOUBLE PRECISION, INTENT(IN) :: cleb(:) +INTEGER, INTENT(IN) :: icleb(:,:) +INTEGER, INTENT(IN) :: iend +INTEGER, INTENT(IN) :: ncheb +INTEGER, INTENT(IN) :: npan_tot +DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(0:) +INTEGER, INTENT(IN) :: ipan_intervall(0:) +DOUBLE PRECISION, INTENT(IN) :: rnew(:) +DOUBLE PRECISION, INTENT(IN) :: vinsnew(:,:,:) +DOUBLE PRECISION, INTENT(IN) :: theta +DOUBLE PRECISION, INTENT(IN) :: phi +INTEGER, INTENT(IN) :: ipot +INTEGER, INTENT(IN) :: lmpotd +INTEGER, INTENT(IN) :: irmd_new +DOUBLE COMPLEX, INTENT(OUT) :: TmatN(:,:) +LOGICAL, INTENT(IN) :: soc +LOGICAL, INTENT(IN) :: enable_quad_prec -!*** Start of declarations rewritten by SPAG +INTEGER :: lmmaxd +INTEGER :: lmmaxso +INTEGER :: nrmaxd -! Local variables +DOUBLE COMPLEX eryd -REAL*8 cgc(nkmpmax,2) -INTEGER :: i,ikm1lin(linmax),ikm2lin(linmax),il,imue,iprint, & - kaptab(nmuemax),ltab(nmuemax),mmax,nmuetab(nmuemax), nsollm(nlmax,nmuemax) +DOUBLE PRECISION, PARAMETER :: cvlight=274.0720442D0 +DOUBLE COMPLEX, PARAMETER :: czero=(0D0,0D0) +DOUBLE COMPLEX, PARAMETER :: cone=(1D0,0D0) -!*** End of declarations rewritten by SPAG -IF (nkmmax /= 2*nlmax**2) STOP ' Check NLMAX,NKMMAX in < DRVBASTRANS > ' -IF (nmuemax /= 2*nlmax) STOP ' Check NLMAX,NMUEMAX in < DRVBASTRANS > ' -IF (nkmpmax /= (nkmmax+2*nlmax)) & - STOP ' Check NLMAX,NKMMAX,NKMPMAX in < DRVBASTRANS > ' -IF (nkmax /= 2*nlmax-1) STOP ' Check NLMAX,NKMAX in < DRVBASTRANS > ' -IF (linmax /= (2*nlmax*(2*nlmax-1))) & - STOP ' Check NLMAX,LINMAX in < DRVBASTRANS > ' +DOUBLE COMPLEX, allocatable :: tmatll(:,:) +DOUBLE COMPLEX, allocatable :: alpha(:,:) +INTEGER :: ir,use_sratrick,nvec,lm1,irmdnew +DOUBLE COMPLEX gmatprefactor +DOUBLE PRECISION, allocatable :: vins(:,:,:) +DOUBLE COMPLEX, allocatable :: vnspll0(:,:,:),vnspll1(:,:,:), vnspll(:,:,:) +DOUBLE COMPLEX, allocatable :: hlk(:,:),jlk(:,:), hlk2(:,:),jlk2(:,:) +DOUBLE COMPLEX, allocatable :: rll(:,:,:),ull(:,:,:) +!DOUBLE COMPLEX, allocatable :: rllleft(:,:,:),sllleft(:,:,:) ! neded for D_ij calculation +DOUBLE COMPLEX, allocatable :: tmatsph(:)! TMAT_OUT(:,:), tmat_out necessary for parallel ie loop +DOUBLE COMPLEX, allocatable :: dtmatll(:,:),tmat0(:,:) ! LLY +DOUBLE COMPLEX, allocatable :: alphall(:,:),dalphall(:,:),alpha0(:,:),aux(:,:) ! LLY +!DOUBLE COMPLEX, allocatable :: alphasph(:)!, DTMAT_OUT(:,:,:), ! LLY +INTEGER, allocatable :: jlk_index(:) +! LLoyd: +!INTEGER :: ideriv,signde ! LLY +!DOUBLE COMPLEX :: tralpha ! LLY +DOUBLE COMPLEX, allocatable :: ipiv(:) ! LLY -iprint = 0 +lmmaxd = (lmax+1)**2 +lmmaxso=2*lmmaxd +nrmaxd=irmd_new -DO i = 1,nmuemax - ltab(i) = i/2 - IF ( 2*ltab(i) == i ) THEN - kaptab(i) = ltab(i) - ELSE - kaptab(i) = -ltab(i) - 1 - END IF - nmuetab(i) = 2*ABS(kaptab(i)) -END DO +allocate(tmatll(lmmaxso,lmmaxso)) +allocate(alpha(lmmaxso,lmmaxso)) +allocate(dtmatll(lmmaxso,lmmaxso)) +allocate(tmat0(lmmaxso,lmmaxso)) +allocate(alphall(lmmaxso,lmmaxso)) +allocate(dalphall(lmmaxso,lmmaxso)) +allocate(alpha0(lmmaxso,lmmaxso)) +allocate(aux(lmmaxso,lmmaxso)) +allocate(jlk_index(2*lmmaxso)) +allocate(ipiv(lmmaxso)) -DO il = 1,nlmax - mmax = 2*il - DO imue = 1,mmax - IF ( (imue == 1) .OR. (imue == mmax) ) THEN - nsollm(il,imue) = 1 - ELSE - nsollm(il,imue) = 2 - END IF +irmdnew= npan_tot*(ncheb+1) +allocate(vins(irmdnew,lmpotd,nspin)) +vins=0D0 +DO lm1=1,lmpotd + DO ir=1,irmdnew + vins(ir,lm1,1)=vinsnew(ir,lm1,ipot) + vins(ir,lm1,nspin)=vinsnew(ir,lm1,ipot+nspin-1) END DO END DO +!c set up the non-spherical ll' matrix for potential VLL' + IF (NSRA.EQ.2) THEN +USE_SRATRICK=1 +ELSEIF (NSRA.EQ.1) THEN +USE_SRATRICK=0 +ENDIF +allocate(vnspll0(lmmaxso,lmmaxso,irmdnew)) +allocate(vnspll1(lmmaxso,lmmaxso,irmdnew)) +vnspll0=czero +CALL vllmat(1,irmdnew,lmmaxd,lmmaxso,vnspll0,vins, & + cleb,icleb,iend,nspin,zat,rnew,use_sratrick) -CALL ikmlin(iprint,nsollm,ikm1lin,ikm2lin,nlmax,nmuemax,linmax, nlmax) +! initial allocate +IF (nsra == 2) THEN + allocate(vnspll(2*lmmaxso,2*lmmaxso,irmdnew)) +ELSE + allocate(vnspll(lmmaxso,lmmaxso,irmdnew)) +END IF -CALL calccgc(ltab,kaptab,nmuetab,cgc,nkmax,nmuemax,nkmpmax) +allocate(hlk(1:4*(lmax+1),irmdnew)) +allocate(jlk(1:4*(lmax+1),irmdnew)) +allocate(hlk2(1:4*(lmax+1),irmdnew)) +allocate(jlk2(1:4*(lmax+1),irmdnew)) +allocate(tmatsph(2*(lmax+1))) +allocate(rll(nsra*lmmaxso,lmmaxso,irmdnew)) +allocate(ull(nsra*lmmaxso,lmmaxso,irmdnew)) +!allocate(rllleft(nsra*lmmaxso,lmmaxso,irmdnew)) +!allocate(sllleft(nsra*lmmaxso,lmmaxso,irmdnew)) +!allocate(tmat_out(lmmaxso,lmmaxso)) -! ---------------------------- now calculate the transformation matrices + eryd = ez(ie) + +! contruct the spin-orbit coupling hamiltonian and add to potential + CALL spinorbit_ham(lmax,lmmaxd,vins,rnew, & + eryd,zat,cvlight,socscale,nspin,lmpotd, & + theta,phi,ipan_intervall,rpan_intervall, npan_tot,ncheb,irmdnew,nrmaxd, & + vnspll0,vnspll1,'1',soc) +!c extend matrix for the SRA treatment + vnspll=czero + IF (nsra == 2) THEN + IF (use_sratrick == 0) THEN + CALL vllmatsra(vnspll1,vnspll,rnew, & + lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=0') + ELSE IF (use_sratrick == 1) THEN + CALL vllmatsra(vnspll1,vnspll,rnew, & + lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=Vsph') + END IF + ELSE + vnspll=vnspll1 + END IF + +!c calculate the source terms in the Lippmann-Schwinger equation +!c these are spherical hankel and bessel functions + hlk=czero + jlk=czero + hlk2=czero + jlk2=czero + gmatprefactor=czero + CALL rllsllsourceterms(nsra,nvec,eryd,rnew,irmdnew,nrmaxd,lmax, & + lmmaxso,1,jlk_index,hlk, & + jlk,hlk2,jlk2, gmatprefactor) +!c using spherical potential as reference + IF (use_sratrick == 1) THEN + CALL calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,zat,cvlight,eryd, & + rnew,vins,ncheb,npan_tot,rpan_intervall, & + jlk_index,hlk,jlk,hlk2, & + jlk2,gmatprefactor,tmatsph,use_sratrick,enable_quad_prec) + END IF + +!c calculate the tmat and wavefunctions + rll(:,:,:)=czero + +!c right solutions + tmatll=czero + CALL rll_global_solutions(rpan_intervall,rnew,vnspll, & + rll,ull,tmatll(:,:),ncheb, & + npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1),irmdnew, & + nsra,jlk_index,hlk,jlk, & + hlk2,jlk2,gmatprefactor,use_sratrick,alpha) +! IF (nsra == 2) THEN +! RLL(LMMAXSO+1:NVEC*LMMAXSO,:,:)= +! + RLL(LMMAXSO+1:NVEC*LMMAXSO,:,:)/C +! END IF +!if(t_dtmatjij_at%calculate) then -CALL strsmat(nlmax-1,cgc,srrel,nrrel,irrel,nkmmax,nkmpmax) -CALL bastrmat(nlmax-1,cgc,rc,crel,rrel,nkmmax,nkmpmax) + + !for Jij-tensor calculation: allocate array to hold additional t-matrices +! call init_t_dtmatJij_at(t_dtmatJij_at) +! +! +!! lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +!! lllllllllll calculate the left-hand side solution lllllllllllllllllllllllllllllllllllll +!! contruct the spin-orbit coupling hamiltonian and add to potential +! call spinorbit_ham(lmax,lmmaxd,vins,rnew, & +! eryd,zat,cvlight,socscale,nsra,nspin,lmpotd, & +! theta,phi,ipan_intervall,rpan_intervall, & +! npan_tot,ncheb,irmdnew,nrmaxd, & +! vnspll0,vnspll1, & +! 'transpose',soc) +! +!! extend matrix for the sra treatment +! vnspll=czero +! if (nsra.eq.2) then +! if (use_sratrick.eq.0) then +! call vllmatsra(vnspll1,vnspll,rnew, & +! lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'ref=0') +! elseif (use_sratrick.eq.1) then +! call vllmatsra(vnspll1,vnspll,rnew, & +! lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'ref=vsph') +! endif +! else +! vnspll=vnspll1 +! endif +! +!! calculate the source terms in the lippmann-schwinger equation +!! these are spherical hankel and bessel functions +! hlk=czero +! jlk=czero +! hlk2=czero +! jlk2=czero +! gmatprefactor=czero +! jlk_index = 0 +! call rllsllsourceterms(nsra,nvec,eryd,rnew,irmdnew,nrmaxd,lmax, & +! lmmaxso,1,jlk_index,hlk, & +! jlk,hlk2,jlk2, & +! gmatprefactor) +! +!! using spherical potential as reference +!! notice that exchange the order of left and right hankel/bessel functions +! if (use_sratrick.eq.1) then +! tmatsph=czero +! call calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,zat,cvlight,eryd, & +! lmpotd,lmmaxso,rnew,vins,ncheb,npan_tot,rpan_intervall, & +! jlk_index,hlk2,jlk2,hlk, & +! jlk,gmatprefactor,tmatsph, & +! use_sratrick) +! endif +! +!! calculate the tmat and wavefunctions +! rllleft(:,:,:)=czero +! sllleft(:,:,:)=czero +! +!! left solutions +!! notice that exchange the order of left and right hankel/bessel functions +! tmat0=czero +! alpha0=czero ! lly +! call rllsll(rpan_intervall,rnew,vnspll, & +! rllleft,sllleft,tmat0,ncheb, & +! npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1),irmdnew, & +! nrmaxd,nsra,jlk_index,hlk2,jlk2, & +! hlk,jlk,gmatprefactor, & +! '1','1','0',use_sratrick) +! if (nsra.eq.2) then +! rllleft(lmmaxso+1:nvec*lmmaxso,:)= & +! rllleft(lmmaxso+1:nvec*lmmaxso,:)/cvlight +! sllleft(lmmaxso+1:nvec*lmmaxso,:,:)= & +! sllleft(lmmaxso+1:nvec*lmmaxso,:,:)/cvlight +! endif +!! lllllllllll calculate the left-hand side solution lllllllllllllllllllllllllllllllllllll +!! lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +! +! call calc_dtmatjij(lmaxd,lmmaxd,lmmaxso,lmpotd,ntotd,nrmaxd, & +! nsra,irmdnew,nspin,vins,rllleft,rll, & +! rpan_intervall, & +! ipan_intervall,npan_tot,ncheb,cleb,icleb,iend,ncleb,rnew, & +! theta,phi,t_dtmatjij_at%dtmat_xyz(:,:,:,ie_num)) -RETURN -END SUBROUTINE drvbastrans - -SUBROUTINE changerep(a,mode,b,n,m,rc,crel,rrel,text,ltext) -! ******************************************************************** -! * * -! * change the representation of matrix A and store in B * -! * according to MODE: * -! * * -! * RLM>REL non-relat. REAL spher. harm. > (kappa,mue) * -! * REL>RLM (kappa,mue) > non-relat. REAL spher. harm. * -! * CLM>REL non-relat. CMPLX. spher. harm. > (kappa,mue) * -! * REL>CLM (kappa,mue) > non-relat. CMPLX. spher. harm. * -! * RLM>CLM non-relat. REAL spher. harm. > CMPLX. spher. harm. * -! * CLM>RLM non-relat. CMPLX. spher. harm. > REAL spher. harm. * -! * * -! * the non-relat. representations include the spin index * -! * * -! * for LTEXT > 0 the new matrix B is printed * -! * * -! ******************************************************************** -IMPLICIT REAL*8(a-h,o-z) +! end if!t_dtmatjij_at%calculate + + +! add spherical contribution of tmatrix + IF (use_sratrick == 1) THEN + DO lm1=1,lmmaxso + tmatll(lm1,lm1)=tmatll(lm1,lm1)+tmatsph(jlk_index(lm1)) + END DO + END IF + TmatN(:,:) = tmatll(:,:) +deallocate(vins) +deallocate(vnspll0) +deallocate(vnspll1) +deallocate(vnspll) +deallocate(hlk) +deallocate(jlk) +deallocate(hlk2) +deallocate(jlk2) +deallocate(tmatsph) +deallocate(alpha) +deallocate(rll) +deallocate(ull) -COMPLEX*16, INTENT(IN OUT) :: a(m,m) -CHARACTER (LEN=7), INTENT(IN) :: mode -COMPLEX*16, INTENT(IN OUT) :: b(m,m) -INTEGER, INTENT(IN OUT) :: n -INTEGER, INTENT(IN OUT) :: m -COMPLEX*16, INTENT(IN OUT) :: rc(m,m) -COMPLEX*16, INTENT(IN OUT) :: crel(m,m) -COMPLEX*16, INTENT(IN OUT) :: rrel(m,m) -CHARACTER (LEN=*), INTENT(IN) :: text -INTEGER, INTENT(IN) :: ltext +END SUBROUTINE tmat_newsolver +SUBROUTINE rhovalnew(ldorhoef,ielast,nsra,nspin,lmax,ez,wez,zat, & + socscale,cleb,icleb,iend,ifunm,lmsp,ncheb, & + npan_tot,npan_log,npan_eq,rmesh,irws, & + rpan_intervall,ipan_intervall, & + rnew,vinsnew,thetasnew,theta,phi,angle_fixed, & + moment_x,moment_y,moment_z, & + ipot, & + den_out,espv,rho2ns,r2nef,gmatn, muorb, & + lpotd,lmaxd,irmd,irmd_new,iemxd,soc,enable_quad_prec) ! new parameters + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-21 Time: 11:39:57 -!*** Start of declarations rewritten by SPAG +IMPLICIT NONE -! PARAMETER definitions +LOGICAL, INTENT(IN) :: ldorhoef +INTEGER, INTENT(IN) :: ielast +INTEGER, INTENT(IN) :: nsra +INTEGER, INTENT(IN) :: nspin +INTEGER, INTENT(IN) :: lmax +DOUBLE COMPLEX, INTENT(IN) :: ez(:) +DOUBLE COMPLEX, INTENT(IN) :: wez(:) +DOUBLE PRECISION, INTENT(IN) :: zat +DOUBLE PRECISION, INTENT(IN) :: socscale +DOUBLE PRECISION, INTENT(IN) :: cleb(:) +INTEGER, INTENT(IN) :: icleb(:,:) +INTEGER, INTENT(IN) :: iend +INTEGER, INTENT(IN) :: ifunm(:) +INTEGER, INTENT(IN) :: lmsp(:) +INTEGER, INTENT(IN) :: ncheb +INTEGER, INTENT(IN) :: npan_tot +INTEGER, INTENT(IN) :: npan_log +INTEGER, INTENT(IN) :: npan_eq +DOUBLE PRECISION, INTENT(IN) :: rmesh(:) +INTEGER, INTENT(IN) :: irws +DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(0:) +INTEGER, INTENT(IN) :: ipan_intervall(0:) +DOUBLE PRECISION, INTENT(IN) :: rnew(:) +DOUBLE PRECISION, INTENT(IN) :: vinsnew(:,:,:) +DOUBLE PRECISION, INTENT(IN) :: thetasnew(:,:) +DOUBLE PRECISION, INTENT(INOUT) :: theta +DOUBLE PRECISION, INTENT(INOUT) :: phi +INTEGER (kind=1), INTENT(IN) :: angle_fixed +DOUBLE PRECISION, INTENT(OUT) :: moment_x +DOUBLE PRECISION, INTENT(OUT) :: moment_y +DOUBLE PRECISION, INTENT(OUT) :: moment_z +INTEGER, INTENT(IN) :: ipot +DOUBLE COMPLEX, INTENT(OUT) :: den_out(0:,:,:) +DOUBLE PRECISION, INTENT(OUT) :: espv(0:,:) +DOUBLE PRECISION, INTENT(OUT) :: rho2ns(:,:,:) +DOUBLE PRECISION, INTENT(OUT) :: r2nef(:,:,:) +DOUBLE COMPLEX, INTENT(IN) :: gmatn(:,:,:) +DOUBLE PRECISION, INTENT(OUT) :: muorb(0:,:) +INTEGER, INTENT(IN) :: lpotd +INTEGER, INTENT(IN) :: lmaxd +INTEGER, INTENT(IN) :: irmd +INTEGER, INTENT(IN) :: irmd_new +INTEGER, INTENT(IN) :: iemxd +LOGICAL, INTENT(IN) :: soc +LOGICAL, INTENT(IN) :: enable_quad_prec -COMPLEX*16, PARAMETER :: c1=(1.0D0,0.0D0) -COMPLEX*16, PARAMETER :: c0=(0.0D0,0.0D0) +DOUBLE PRECISION, PARAMETER :: cvlight=274.0720442D0 +DOUBLE COMPLEX, PARAMETER :: czero=(0D0,0D0) +DOUBLE COMPLEX, PARAMETER :: cone=(1D0,0D0) -! Dummy arguments +INTEGER :: lmmaxd, lmaxd1, lmmaxso, lmpotd, lmxspd, nrmaxd +DOUBLE COMPLEX eryd, ek,df + +DOUBLE COMPLEX, allocatable :: tmatll(:,:), & + tmattemp(:,:),alpha(:,:),alphaleft(:,:) +DOUBLE COMPLEX, allocatable :: gmatll(:,:,:), gmat0(:,:) +INTEGER :: ir,use_sratrick,nvec,lm1,lm2,ie,irmdnew,imt1, & + jspin,idim,iorb +DOUBLE PRECISION :: pi,thetanew,phinew +DOUBLE COMPLEX gmatprefactor +DOUBLE PRECISION, allocatable :: vins(:,:,:) +DOUBLE COMPLEX,allocatable :: vnspll0(:,:,:),vnspll1(:,:,:), vnspll(:,:,:) +DOUBLE COMPLEX, allocatable :: hlk(:,:),jlk(:,:), hlk2(:,:),jlk2(:,:) +DOUBLE COMPLEX, allocatable :: rll(:,:,:),ull(:,:,:), & + rllleft(:,:,:),ullleft(:,:,:),sllleft(:,:,:) +DOUBLE COMPLEX, allocatable :: tmatsph(:) +DOUBLE COMPLEX, allocatable :: cden(:,:,:), & + cdenlm(:,:,:),cdenns(:,:),rho2nsc(:,:,:),r2nefc(:,:,:), & + rho2nsnew(:,:,:),r2nefnew(:,:,:),r2orbc(:,:,:), & + rho2nsc_loop(:,:,:,:), r2nefc_loop(:,:,:) +DOUBLE COMPLEX, allocatable:: den(:,:,:,:),denlm(:,:,:,:) +DOUBLE COMPLEX rho2(4),rho2int(4),temp1 +DOUBLE COMPLEX rho2ns_temp(2,2),dentemp +DOUBLE PRECISION :: moment(3),totmoment,totxymoment +DOUBLE PRECISION :: denorbmom(3),denorbmomsp(2,4), & + denorbmomlm(0:lmaxd,3),denorbmomns(3) +DOUBLE COMPLEX, allocatable :: cdentemp(:), rhotemp(:,:),rhonewtemp(:,:) +INTEGER, allocatable :: jlk_index(:) +LOGICAL :: test,opt +EXTERNAL test,opt +INTEGER :: iq,nqdos ! qdos ruess: number of qdos points +EXTERNAL zgemm,dscal,daxpy +lmmaxd = (lmaxd+1)**2 +lmaxd1 = lmaxd+1 +lmmaxso = 2*lmmaxd +lmpotd = (lpotd+1)**2 +lmxspd = (2*lpotd+1)**2 +nrmaxd=irmd_new -! Local variables +allocate(tmatll(lmmaxso,lmmaxso)) +allocate(tmattemp(lmmaxso,lmmaxso)) +allocate(alpha(lmmaxso,lmmaxso)) +allocate(alphaleft(lmmaxso,lmmaxso)) +allocate(gmatll(lmmaxso,lmmaxso,iemxd)) +allocate(gmat0(lmmaxso,lmmaxso)) +!allocate(dentmp(0:lmaxd1,2)) +allocate(jlk_index(2*lmmaxso)) -INTEGER :: key -COMPLEX*16 w1(m,m) +pi=4D0*DATAN(1D0) +irmdnew= npan_tot*(ncheb+1) +imt1=ipan_intervall(npan_log+npan_eq)+1 +allocate(vins(irmdnew,lmpotd,nspin)) +vins=0D0 +DO lm1=1,lmpotd + DO ir=1,irmdnew + vins(ir,lm1,1)=vinsnew(ir,lm1,ipot) + vins(ir,lm1,nspin)=vinsnew(ir,lm1,ipot+nspin-1) + END DO +END DO -!*** End of declarations rewritten by SPAG +!c set up the non-spherical ll' matrix for potential VLL' +IF (NSRA.EQ.2) THEN +USE_SRATRICK=1 +ELSE +USE_SRATRICK=0 +ENDIF +allocate(vnspll0(lmmaxso,lmmaxso,irmdnew)) +allocate(vnspll1(lmmaxso,lmmaxso,irmdnew)) +vnspll0=czero +CALL vllmat(1,irmdnew,lmmaxd,lmmaxso,vnspll0,vins, & + cleb,icleb,iend,nspin,zat,rnew,use_sratrick) -!---------------------- transform MAT from (kappa,mue) to REAL (l,ml,ms) -IF ( mode == 'REL>RLM' ) THEN - CALL zgemm('N','N',n,n,n,c1,rrel,m,a,m,c0,w1,m) - CALL zgemm('N','C',n,n,n,c1,w1,m,rrel,m,c0,b,m) - key = 2 -ELSE IF ( mode == 'RLM>REL' ) THEN - CALL zgemm('C','N',n,n,n,c1,rrel,m,a,m,c0,w1,m) - CALL zgemm('N','N',n,n,n,c1,w1,m,rrel,m,c0,b,m) - key = 3 -ELSE IF ( mode == 'REL>CLM' ) THEN - CALL zgemm('N','N',n,n,n,c1,crel,m,a,m,c0,w1,m) - CALL zgemm('N','C',n,n,n,c1,w1,m,crel,m,c0,b,m) - key = 2 -ELSE IF ( mode == 'CLM>REL' ) THEN - CALL zgemm('C','N',n,n,n,c1,crel,m,a,m,c0,w1,m) - CALL zgemm('N','N',n,n,n,c1,w1,m,crel,m,c0,b,m) - key = 3 -ELSE IF ( mode == 'CLM>RLM' ) THEN - CALL zgemm('N','N',n,n,n,c1,rc,m,a,m,c0,w1,m) - CALL zgemm('N','C',n,n,n,c1,w1,m,rc,m,c0,b,m) - key = 2 -ELSE IF ( mode == 'RLM>CLM' ) THEN - CALL zgemm('C','N',n,n,n,c1,rc,m,a,m,c0,w1,m) - CALL zgemm('N','N',n,n,n,c1,w1,m,rc,m,c0,b,m) - key = 2 +! initial allocate +IF (nsra == 2) THEN + allocate(vnspll(2*lmmaxso,2*lmmaxso,irmdnew)) ELSE - WRITE (*,*) ' MODE = ',mode - STOP 'in <ROTATE> MODE not allowed' + allocate(vnspll(lmmaxso,lmmaxso,irmdnew)) END IF -IF ( ltext > 0 ) CALL cmatstr(text,ltext,b,n,m,key,key,0,1D-8,6) -! IF ( LTEXT.GT.0 ) CALL CMATSTR(TEXT,LTEXT,B,N,M,KEY,KEY,0,1D-12,6) -END SUBROUTINE changerep - -SUBROUTINE create_newmesh_new(r_log,npan_log,npan_eq,ncheb, & - npan_lognew,npan_eqnew, & - npan_tot,rnew,rpan_intervall,ipan_intervall, & - thetasnew,thetas,nfu,radial_mesh) ! new parameters - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-03-29 Time: 17:20:39 - -!use DimParams_mod -!use InputParams_mod -use read_formatted_shapefun_mod, only: ShapefunFile - -!INTEGER, INTENT(IN) :: nspin -DOUBLE PRECISION, INTENT(IN) :: r_log -INTEGER, INTENT(IN) :: npan_log -INTEGER, INTENT(IN) :: npan_eq -INTEGER, INTENT(IN) :: ncheb -INTEGER, INTENT(OUT) :: npan_lognew -INTEGER, INTENT(OUT) :: npan_eqnew -INTEGER, INTENT(OUT) :: npan_tot -DOUBLE PRECISION, INTENT(OUT) :: rnew(:) -!DOUBLE PRECISION, INTENT(IN) :: thetas(irid,nfund,ncelld) -DOUBLE PRECISION, INTENT(OUT) :: rpan_intervall(0:) -INTEGER, INTENT(OUT) :: ipan_intervall(0:) -DOUBLE PRECISION, INTENT(OUT) :: thetasnew(:,:) -DOUBLE PRECISION, INTENT(IN) :: thetas(:,:) -INTEGER, INTENT(IN) :: nfu -type(RadialMeshData), INTENT(IN) :: radial_mesh -!type(ShapefunFile), intent(in) :: sfile -!type(InputParams), intent(in) :: params -!type(DimParams), intent(in) :: dims - -!IMPLICIT NONE -!INCLUDE 'inc.p' - - -!INTEGER, PARAMETER :: lmmaxd= (lmaxd+1)**2 - -!INTEGER, PARAMETER :: lmpotd= (lpotd+1)**2 - -!INTEGER, PARAMETER :: irmind= irmd-irnsd -!INTEGER :: npan_inst -!INTEGER :: npan_lognew(dims%naez) - - +allocate(hlk(4*(lmax+1),irmdnew)) +allocate(jlk(4*(lmax+1),irmdnew)) +allocate(hlk2(4*(lmax+1),irmdnew)) +allocate(jlk2(4*(lmax+1),irmdnew)) +allocate(tmatsph(2*(lmax+1))) +allocate(rll(nsra*lmmaxso,lmmaxso,irmdnew)) +allocate(rllleft(nsra*lmmaxso,lmmaxso,irmdnew)) +allocate(ull(nsra*lmmaxso,lmmaxso,irmdnew)) +allocate(ullleft(nsra*lmmaxso,lmmaxso,irmdnew)) +allocate(sllleft(nsra*lmmaxso,lmmaxso,irmdnew)) +allocate(cden(irmdnew,0:lmaxd,4)) +allocate(cdenlm(irmdnew,lmmaxd,4)) +allocate(cdenns(irmdnew,4)) +allocate(rho2nsc(irmdnew,lmpotd,4)) +allocate(rho2nsc_loop(irmdnew,lmpotd,4,ielast)) +allocate(rho2nsnew(irmd,lmpotd,4)) +allocate(r2nefc(irmdnew,lmpotd,4)) +allocate(r2nefc_loop(irmdnew,lmpotd,4)) +allocate(r2nefnew(irmd,lmpotd,4)) +allocate(r2orbc(irmdnew,lmpotd,4)) +allocate(cdentemp(irmdnew)) +allocate(den(0:lmaxd1,iemxd,2,1),denlm(lmmaxd,iemxd,2,1)) +rho2nsc=czero +rho2nsc_loop=czero +r2nefc=czero +r2nefc_loop=czero +r2orbc=czero +rho2ns=0.d0 ! fivos 19.7.2014, this was CZERO +r2nef=0.d0 ! fivos 19.7.2014, this was CZERO +rho2nsnew=czero +r2nefnew=czero +den=czero +espv=0D0 +rho2int=czero +denorbmom=0D0 +denorbmomsp=0D0 +denorbmomlm=0D0 +denorbmomns=0D0 +thetanew=0D0 +phinew=0D0 -DOUBLE PRECISION, PARAMETER :: fac=2D0 -INTEGER :: ipotm,ir2,ip, & - ishift,ilogpanshift,ilinpanshift,npan_logtemp,npan_inst,imin,imax,iminnew,imaxnew,lm1 -DOUBLE PRECISION :: rmin,rmax,rval -!type(RadialMeshData) :: radial_mesh +GMAT0 = czero +gmatll = czero -! set up radial mesh -!call createRadialMeshData(radial_mesh, dims%irmd, sfile%mesh(i1)%npan+1) +DO ir=1,3 + DO lm1=0,lmaxd1+1 + muorb(lm1,ir)=0D0 + END DO +END DO -! local arrays to be filled with data from 'sfile' -! --------------------------------------------- -!DOUBLE PRECISION, allocatable :: r(:,:) -!INTEGER, allocatable :: irmin(:) -!INTEGER, allocatable :: irws(:) -!INTEGER, allocatable :: ipan(:) -!INTEGER, allocatable :: ircut(:,:) -!DOUBLE PRECISION, allocatable :: thetasin(:,:,:) + nqdos = 1 ! qdos ruess -!allocate(r(size(sfile%mesh(i1)%r),dims%naez)) -!allocate(irmin(dims%naez)) -!allocate(irws(dims%naez)) -!allocate(ipan(dims%naez)) -!allocate(ircut(size(sfile%mesh(i1)%ircut),dims%naez)) -!allocate(thetasin(dims%irid,sfile%shapes(1)%nfu,dims%naez)) ! #shapefunctions = #atoms in KKRnano, can nfu be different for different shapes?! +DO ie=1,ielast -!DO i1 = 1,dims%naez - - !call createRadialMeshData(meshdata, irmd, ipand) - !call initRadialMesh(meshdata, alat, sfile%mesh(cell_index)%xrn, & - ! sfile%mesh(cell_index)%drn, sfile%mesh(cell_index)%nm, irmd-irid, irns) -! r(:,i1) = sfile%mesh(i1)%r -! irmin(i1) = sfile%mesh(i1)%irmin -! irws(i1) = sfile%mesh(i1)%irws -! ipan(i1) = sfile%mesh(i1)%ipan -! ircut(:,i1) = sfile%mesh(i1)%ircut -! DO lm1=1,sfile%shapes(i1)%nfu -! thetasin(:,lm1,i1)=sfile%shapes(i1)%thetas(:,lm1) ! #shapefunctions = #atoms in KKRnano -! ENDDO -!ENDDO -! ---------------------------------------------- - - -thetasnew=0D0 -ipotm=0 - -!DO i1 = 1,dims%naez ! JM: NATYPD instead of NAEZ - - ! set up radial mesh for atom i1 -! call createRadialMeshData(radial_mesh, dims%irmd, sfile%mesh(i1)%npan+1) -! call initRadialMesh(radial_mesh, params%alat, sfile%mesh(i1)%xrn, & -! sfile%mesh(i1)%drn, sfile%mesh(i1)%nm, & -! dims%irmd-dims%irid, dims%irnsd) - -! ipot=dims%nspind*(i1-1)+1 - npan_inst = radial_mesh%ipan-1 - npan_tot = npan_log+npan_eq+npan_inst + eryd=ez(ie) + ek=SQRT(eryd) + df=wez(ie)/DBLE(nspin) + IF (nsra == 2) ek = SQRT( eryd + eryd*eryd/(cvlight*cvlight) ) * & + ( 1D0 + eryd/(cvlight*cvlight) ) +! recalculate wavefuntions, also include left solution +! contruct the spin-orbit coupling hamiltonian and add to potential + CALL spinorbit_ham(lmax,lmmaxd,vins,rnew, & + eryd,zat,cvlight,socscale,nspin,lmpotd, & + theta,phi,ipan_intervall,rpan_intervall, npan_tot,ncheb,irmdnew,nrmaxd, & + vnspll0,vnspll1,'1',soc) -! log panel - rmin=radial_mesh%r(2) - rmax=r_log - rval=0D0 - ishift=0 - IF (r_log > radial_mesh%r(radial_mesh%irmin)) THEN - ilogpanshift=1 - ilinpanshift=0 +!c extend matrix for the SRA treatment + vnspll=czero + IF (nsra == 2) THEN + IF (use_sratrick == 0) THEN + CALL vllmatsra(vnspll1,vnspll,rnew, & + lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=0') + ELSE IF (use_sratrick == 1) THEN + CALL vllmatsra(vnspll1,vnspll,rnew, & + lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=Vsph') + END IF ELSE - ilogpanshift=0 - ilinpanshift=1 + vnspll=vnspll1 END IF - IF (ilinpanshift == 1) THEN - STOP 'non-spherical part of the potential needs to be inside the log panel' - END IF - - DO ip=0,npan_log-ilogpanshift - rval=(fac**ip-1D0)/(fac**(npan_log-ilogpanshift)-1D0) - rpan_intervall(ip+ishift)= rmin+rval*(rmax-rmin) - ipan_intervall(ip+ishift)= (ip+ishift)*(ncheb+1) - IF (ishift == 0.AND. rpan_intervall(ip) > radial_mesh%r(radial_mesh%irmin)) THEN - ishift=1 - npan_logtemp=ip - rpan_intervall(ip+1)=rpan_intervall(ip) - ipan_intervall(ip+1)=(ip+ishift)*(ncheb+1) - rpan_intervall(ip)=radial_mesh%r(radial_mesh%irmin) - ipan_intervall(ip)=ip*(ncheb+1) - END IF - END DO ! NPAN_LOG +!c calculate the source terms in the Lippmann-Schwinger equation +!c these are spherical hankel and bessel functions + hlk=czero + jlk=czero + hlk2=czero + jlk2=czero + gmatprefactor=czero + jlk_index=0 + CALL rllsllsourceterms(nsra,nvec,eryd,rnew,irmdnew,nrmaxd,lmax, & + lmmaxso,1,jlk_index,hlk, & + jlk,hlk2,jlk2, gmatprefactor) -! equivalent panel - ishift=0 - rmin=r_log - rmax=radial_mesh%r(radial_mesh%ircut(1)) - DO ip=0,npan_eq-ilinpanshift - rpan_intervall(ip+ishift+npan_log)=rmin+ip*(rmax-rmin)/ & - (npan_eq-ilinpanshift) - ipan_intervall(ip+ishift+npan_log)=(npan_log+ip+ishift)* (ncheb+1) - END DO ! NPAN_EQ +! using spherical potential as reference + IF (use_sratrick == 1) THEN + CALL calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,zat,cvlight,eryd, & + rnew,vins,ncheb,npan_tot,rpan_intervall, & + jlk_index,hlk,jlk,hlk2, & + jlk2,gmatprefactor,tmatsph,use_sratrick,enable_quad_prec) + END IF + +!c calculate the tmat and wavefunctions + rllleft=czero + sllleft=czero + +!c right solutions + tmatll=czero + CALL rll_global_solutions(rpan_intervall,rnew,vnspll, & + rll,ull,tmatll, & + ncheb,npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1), & + irmdnew,nsra,jlk_index,hlk,jlk, & + hlk2,jlk2, gmatprefactor,use_sratrick,alpha) + IF (nsra == 2) THEN + rll(lmmaxso+1:nvec*lmmaxso,:,:)= & + rll(lmmaxso+1:nvec*lmmaxso,:,:)/cvlight + ull(lmmaxso+1:nvec*lmmaxso,:,:)= & + ull(lmmaxso+1:nvec*lmmaxso,:,:)/cvlight + END IF + +! left solutions +! contruct the TRANSPOSE spin-orbit coupling hamiltonian and add to potential + CALL spinorbit_ham(lmax,lmmaxd,vins,rnew,eryd,zat, & + cvlight,socscale,nspin,lmpotd,theta,phi, & + ipan_intervall,rpan_intervall,npan_tot,ncheb, & + irmdnew,nrmaxd,vnspll0,vnspll1, 'transpose',soc) + +!c extend matrix for the SRA treatment + vnspll=czero + IF (nsra == 2) THEN + IF (use_sratrick == 0) THEN + CALL vllmatsra(vnspll1,vnspll,rnew, & + lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=0') + ELSE IF (use_sratrick == 1) THEN + CALL vllmatsra(vnspll1,vnspll,rnew, & + lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=Vsph') + END IF + ELSE + vnspll=vnspll1 + END IF -! intersection zone - DO ip=1,npan_inst - rpan_intervall(npan_log+npan_eq+ip)=radial_mesh%r(radial_mesh%ircut(ip+1)) - ipan_intervall(npan_log+npan_eq+ip)=(npan_log+npan_eq+ip)* (ncheb+1) - END DO ! NPAN_INST +!c calculate the source terms in the Lippmann-Schwinger equation +!c these are spherical hankel and bessel functions + hlk=czero + jlk=czero + hlk2=czero + jlk2=czero + gmatprefactor=czero + jlk_index=0 + CALL rllsllsourceterms(nsra,nvec,eryd,rnew,irmdnew,nrmaxd,lmax, & + lmmaxso,1,jlk_index,hlk, & + jlk,hlk2,jlk2, gmatprefactor) - npan_eqnew=npan_eq+npan_log-npan_logtemp - npan_lognew=npan_logtemp +!c using spherical potential as reference +! notice that exchange the order of left and right hankel/bessel functions + IF (use_sratrick == 1) THEN + CALL calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,zat,cvlight,eryd, & + rnew,vins,ncheb,npan_tot,rpan_intervall, & + jlk_index,hlk2,jlk2, & + hlk,jlk,gmatprefactor,tmatsph,use_sratrick,enable_quad_prec) + END IF - CALL chebmesh(npan_tot,ncheb,rpan_intervall(0:), rnew(1:)) +!c calculate the tmat and wavefunctions + rllleft=czero + sllleft=czero -! interpolate shape function THETAS to new shape function THETASNEW -! save THETAS to THETASIN -! icell = i1 ! #shapefunctions = #atoms in KKRnano, JM: ICELL = NTCELL(I1) - DO lm1=1,nfu -! thetasin(:,lm1,icell)=sfile%shapes(icell)%thetas(:,lm1) ! get thetas for specific atom and lm1 - ir2=0 - DO ip=npan_lognew+npan_eqnew+1,npan_tot - ir2=ir2+1 - imin=radial_mesh%ircut(ir2)+1 - imax=radial_mesh%ircut(ir2+1) - iminnew=ipan_intervall(ip-1)+1 - imaxnew=ipan_intervall(ip) - CALL interpolspline(radial_mesh%r(imin:imax),rnew(iminnew:imaxnew), & - thetas(imin-radial_mesh%ircut(1):imax-radial_mesh%ircut(1),lm1), & - thetasnew(iminnew:imaxnew,lm1), imax-imin+1,imaxnew-iminnew+1) +!c left solutions +! notice that exchange the order of left and right hankel/bessel functions + tmattemp=czero + CALL sll_global_solutions(rpan_intervall,rnew,vnspll, & + sllleft, & + ncheb,npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1), & + irmdnew,nsra,jlk_index,hlk2,jlk2, & + hlk,jlk, gmatprefactor,use_sratrick,enable_quad_prec,.true.) + CALL rll_global_solutions(rpan_intervall,rnew,vnspll, & + rllleft,ullleft,tmattemp, & + ncheb,npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1), & + irmdnew,nsra,jlk_index,hlk2,jlk2, & + hlk,jlk, gmatprefactor,use_sratrick,alphaleft) + IF (nsra == 2) THEN + rllleft(lmmaxso+1:nvec*lmmaxso,:,:)= & + rllleft(lmmaxso+1:nvec*lmmaxso,:,:)/cvlight + sllleft(lmmaxso+1:nvec*lmmaxso,:,:)= & + sllleft(lmmaxso+1:nvec*lmmaxso,:,:)/cvlight + END IF + DO iq = 1,nqdos ! qdos + den(:,ie,:,iq)=czero + + GMAT0 = gmatn(:,:,ie) +! rotate gmat from global frame to local frame + CALL rotatematrix(gmat0,theta,phi,lmmaxd,1) + + DO lm1=1,lmmaxso + DO lm2=1,lmmaxso + gmatll(lm1,lm2,ie)=gmat0(lm1,lm2) + END DO END DO - END DO - -!call destroyRadialMeshData(radial_mesh) -!END DO ! I1 -END SUBROUTINE create_newmesh_new - - -SUBROUTINE chebmesh(npan,ncheb,ri,ro) +! calculate density + CALL rhooutnew(nsra,lmmaxd,lmmaxso,lmax,gmatll(:,:,ie),ek, & + df,cleb,icleb,iend, & + irmdnew,thetasnew,ifunm,imt1,lmsp, & + rll, ull, rllleft,sllleft, & + cden,cdenlm, & + cdenns,rho2nsc_loop(:,:,:,ie),0, & + lmaxd) + + DO jspin=1,4 + + DO lm1 = 0,lmax + cdentemp=czero + dentemp=czero + DO ir=1,irmdnew + cdentemp(ir)=cden(ir,lm1,jspin) + END DO + CALL intcheb_cell(cdentemp,dentemp, & + rpan_intervall,ipan_intervall,npan_tot,ncheb,irmdnew) + rho2(jspin)=dentemp + rho2int(jspin)=rho2int(jspin)+rho2(jspin)*df + IF (jspin <= 2) THEN + den(lm1,ie,jspin,iq)=rho2(jspin) + END IF + END DO + + IF (jspin <= 2) THEN + DO lm1 = 1,lmmaxd + cdentemp=czero + dentemp=czero + DO ir=1,irmdnew + cdentemp(ir)=cdenlm(ir,lm1,jspin) + END DO + CALL intcheb_cell(cdentemp,dentemp, & + rpan_intervall,ipan_intervall,npan_tot,ncheb,irmdnew) + denlm(lm1,ie,jspin,iq)=dentemp + END DO + cdentemp=czero + dentemp=czero + DO ir=1,irmdnew + cdentemp(ir)=cdenns(ir,jspin) + END DO + CALL intcheb_cell(cdentemp,dentemp, & + rpan_intervall,ipan_intervall,npan_tot,ncheb,irmdnew) + den(lmaxd1,ie,jspin,iq)=dentemp + rho2int(jspin)=rho2int(jspin)+den(lmaxd1,ie,jspin,iq)*df + END IF + END DO ! JSPIN + + DO jspin=1,4 + IF (jspin <= 2) THEN + DO lm1=0,lmaxd1 + espv(lm1,jspin)=espv(lm1,jspin)+ & + DIMAG( eryd * den(lm1,ie,jspin,iq) * df ) + END DO + END IF + END DO + END DO ! IQ = 1,NQDOS +!END DO -INTEGER, INTENT(IN) :: npan -INTEGER, INTENT(IN) :: ncheb -DOUBLE PRECISION, INTENT(IN) :: ri(0:npan) -DOUBLE PRECISION, INTENT(OUT) :: ro(npan*(ncheb+1)) -!IMPLICIT NONE +! get charge at the Fermi energy (IELAST) +IF (ie == ielast.AND.ldorhoef) THEN + CALL rhooutnew(nsra,lmmaxd,lmmaxso,lmax,gmatll(:,:,ie),ek, & + cone,cleb,icleb,iend, & + irmdnew,thetasnew,ifunm,imt1,lmsp, & + rll, ull, rllleft,sllleft, & + cden,cdenlm, & + cdenns,r2nefc_loop,0, & + lmaxd) +END IF -INTEGER :: i,k,ik -DOUBLE PRECISION :: tau,pi +! get orbital moment +DO iorb=1,3 + CALL rhooutnew(nsra,lmmaxd,lmmaxso,lmax,gmatll(:,:,ie),ek, & + cone,cleb,icleb,iend, & + irmdnew,thetasnew,ifunm,imt1,lmsp, & + rll, ull, rllleft,sllleft, & + cden,cdenlm, & + cdenns,r2orbc,iorb, & + lmaxd) + DO jspin=1,4 + IF (jspin <= 2) THEN + DO lm1=0,lmax + cdentemp=czero + dentemp=czero + DO ir=1,irmdnew + cdentemp(ir)=cden(ir,lm1,jspin) + END DO + CALL intcheb_cell(cdentemp,dentemp,rpan_intervall, & + ipan_intervall,npan_tot,ncheb,irmdnew) + rho2(jspin)=dentemp + muorb(lm1,jspin)=muorb(lm1,jspin)-DIMAG(rho2(jspin)*df) + denorbmom(iorb)=denorbmom(iorb)-DIMAG(rho2(jspin)*df) + denorbmomsp(jspin,iorb)=denorbmomsp(jspin,iorb)- DIMAG(rho2(jspin)*df) + denorbmomlm(lm1,iorb)=denorbmomlm(lm1,iorb)- DIMAG(rho2(jspin)*df) + cdentemp=czero + DO ir=1,irmdnew + cdentemp(ir)=cdenns(ir,jspin) + END DO + CALL intcheb_cell(cdentemp,temp1, & + rpan_intervall,ipan_intervall,npan_tot,ncheb,irmdnew) + denorbmomns(iorb)=denorbmomns(iorb)-DIMAG(temp1*df) + END DO + END IF + END DO +END DO ! IORB +END DO ! IE loop -pi=4D0*DATAN(1D0) -DO i=1,npan - DO k=0,ncheb - ik=i*ncheb+i-k - tau=DCOS(((2*k+1)*pi)/(2*(ncheb+1))) - tau=0.5D0*((ri(i)-ri(i-1))*tau+ri(i)+ri(i-1)) - ro(ik)=tau +DO ir=1,irmdnew + DO lm1=1,lmpotd + DO jspin=1,4 + DO ie=1,ielast + rho2nsc(ir,lm1,jspin) = rho2nsc(ir,lm1,jspin) + & + rho2nsc_loop(ir,lm1,jspin,ie) + END DO + END DO END DO END DO -END SUBROUTINE chebmesh + r2nefc(:,:,:) = r2nefc(:,:,:) + r2nefc_loop(:,:,:) +allocate(rhotemp(irmdnew,lmpotd)) +allocate(rhonewtemp(irws,lmpotd)) +DO jspin=1,4 + rhotemp=czero + rhonewtemp=czero + DO lm1=1,lmpotd + DO ir=1,irmdnew + rhotemp(ir,lm1)=rho2nsc(ir,lm1,jspin) + END DO + END DO + CALL cheb2oldgrid(irws,irmdnew,lmpotd,rmesh,ncheb,npan_tot, & + rpan_intervall,ipan_intervall, rhotemp,rhonewtemp,irmd) + DO lm1=1,lmpotd + DO ir=1,irws + rho2nsnew(ir,lm1,jspin)=rhonewtemp(ir,lm1) + END DO + END DO + + rhotemp=czero + rhonewtemp=czero + DO lm1=1,lmpotd + DO ir=1,irmdnew + rhotemp(ir,lm1)=r2nefc(ir,lm1,jspin) + END DO + END DO + CALL cheb2oldgrid(irws,irmdnew,lmpotd,rmesh,ncheb,npan_tot, & + rpan_intervall,ipan_intervall, rhotemp,rhonewtemp,irmd) + DO lm1=1,lmpotd + DO ir=1,irws + r2nefnew(ir,lm1,jspin)=rhonewtemp(ir,lm1) + END DO + END DO +END DO +deallocate(rhotemp) +deallocate(rhonewtemp) +! calculate new THETA and PHI for non-colinear +!IF (.NOT.test('FIXMOM ')) THEN +if (angle_fixed == 0) then ! angle not fixed + rho2ns_temp(1,1)=rho2int(1) + rho2ns_temp(2,2)=rho2int(2) + rho2ns_temp(1,2)=rho2int(3) + rho2ns_temp(2,1)=rho2int(4) + + CALL rotatematrix(rho2ns_temp,theta,phi,1,0) + + rho2int(1)=rho2ns_temp(1,1) + rho2int(2)=rho2ns_temp(2,2) + rho2int(3)=rho2ns_temp(1,2) + rho2int(4)=rho2ns_temp(2,1) + + + moment(1)=DIMAG(rho2int(3)+rho2int(4)) + moment(2)=-REAL(rho2int(3)-rho2int(4)) + moment(3)=DIMAG(-rho2int(1)+rho2int(2)) -SUBROUTINE bastrmat(lmax,cgc,rc,crel,rrel,nkmmax,nkmpmax) -! ******************************************************************** -! * * -! * INITIALIZE TRANSFORMATION MATRIX THAT TAKES MATRICES FROM * -! * RELATIVISTIC TO REAL SPERICAL HARM. REPRESENTATION * -! * * -! * this is a special version of <STRSMAT> passing the * -! * full BASis TRansformation MATrices RC, CREL and RREL * -! * * -! * 13/01/98 HE * -! ******************************************************************** + moment_x=moment(1) + moment_y=moment(2) + moment_z=moment(3) + + totmoment=SQRT(moment(1)**2+moment(2)**2+moment(3)**2) + totxymoment=SQRT(moment(1)**2+moment(2)**2) + + IF (ABS(totxymoment) > 1D-05) THEN + IF (ABS(moment(3)) < 1D-05) THEN + thetanew=pi/2D0 + ELSE + thetanew=ACOS(moment(3)/totmoment) + END IF + IF (totxymoment < 1D-05) THEN + phinew=0D0 + ELSE + phinew=DATAN2(moment(2),moment(1)) + END IF + END IF -IMPLICIT REAL*8(a-h,o-z) + ! UPDATE ANGLES +! phi = phinew +! theta = thetanew -INTEGER, INTENT(IN) :: lmax -REAL*8, INTENT(IN) :: cgc(nkmpmax,2) -COMPLEX*16, INTENT(OUT) :: rc(nkmmax,nkmmax) -COMPLEX*16, INTENT(OUT) :: crel(nkmmax,nkmmax) -COMPLEX*16, INTENT(IN OUT) :: rrel(nkmmax,nkmmax) -INTEGER, INTENT(IN) :: nkmmax -INTEGER, INTENT(IN) :: nkmpmax + ! THETANEW=ACOS(MOMENT(3)/TOTMOMENT) +! PHINEW=DATAN2(MOMENT(2),MOMENT(1)) +! WRITE(6,*) 'moment',moment(1),moment(2),moment(3) +! WRITE(6,*) 'total moment',TOTMOMENT,TOTXYMOMENT +! WRITE(6,*) 'angles', thetanew,phinew +! WRITE(11,*) thetanew,phinew +! WRITE(12,*) thetanew,phinew -!*** Start of declarations rewritten by SPAG +! Use old angles for rotation +!if (angle_fixed == 1) then +! thetanew = theta +! phinew = phi +!endif -! PARAMETER definitions + CALL rotatevector(rho2nsnew,rho2ns,irws,lmpotd,thetanew,phinew, & + theta,phi,irmd) + CALL rotatevector(r2nefnew,r2nef,irws,lmpotd,thetanew,phinew, & + theta,phi,irmd) -COMPLEX*16, PARAMETER :: ci=(0.0D0,1.0D0) -COMPLEX*16, PARAMETER :: c1=(1.0D0,0.0D0) -COMPLEX*16, PARAMETER :: c0=(0.0D0,0.0D0) +else ! angle fixed -! Local variables + rho2ns_temp(1,1)=rho2int(1) + rho2ns_temp(2,2)=rho2int(2) + rho2ns_temp(1,2)=rho2int(3) + rho2ns_temp(2,1)=rho2int(4) + + CALL rotatematrix(rho2ns_temp,theta,phi,1,0) + + rho2int(1)=rho2ns_temp(1,1) + rho2int(2)=rho2ns_temp(2,2) + rho2int(3)=rho2ns_temp(1,2) + rho2int(4)=rho2ns_temp(2,1) -INTEGER :: i,ikm,j,jp05,k,l,lm,lnr,m,muem05,muep05,nk,nkm,nlm -REAL*8 w + moment(1)=DIMAG(rho2int(3)+rho2int(4)) + moment(2)=-REAL(rho2int(3)-rho2int(4)) + moment(3)=DIMAG(-rho2int(1)+rho2int(2)) -!*** End of declarations rewritten by SPAG + moment_x=moment(1) + moment_y=moment(2) + moment_z=moment(3) + + rho2ns(:,:,:)=DIMAG(rho2nsnew(:,:,:)) + r2nef(:,:,:)=DIMAG(r2nefnew(:,:,:)) +endif -nk = 2*(lmax+1) + 1 -nlm = (lmax+1)**2 -nkm = 2*nlm -! =================================================== -! INDEXING: -! IKM = L*2*(J+1/2) + J + MUE + 1 -! LM = L*(L+1) + M + 1 -! =================================================== +idim = irmd*lmpotd +CALL dscal(idim,2.d0,rho2ns(1,1,1),1) +CALL daxpy(idim,-0.5D0,rho2ns(1,1,1),1,rho2ns(1,1,2),1) +CALL daxpy(idim,1.0D0,rho2ns(1,1,2),1,rho2ns(1,1,1),1) -! ---------------------------------------------------------------------- -! CREL transforms from COMPLEX (L,M,S) to (KAP,MUE) - representation -! |LAM> = sum[LC] |LC> * CREL(LC,LAM) -! ---------------------------------------------------------------------- -CALL cinit(nkmmax*nkmmax,crel) +! --> do the same at the Fermi energy -lm = 0 -DO lnr = 0,lmax - DO m = -lnr,lnr - lm = lm + 1 - - ikm = 0 - DO k = 1,nk - l = k/2 - IF ( 2*l == k ) THEN - jp05 = l - ELSE - jp05 = l + 1 - END IF - - DO muem05 = -jp05,(jp05-1) - muep05 = muem05 + 1 - ikm = ikm + 1 - - IF ( l == lnr ) THEN - IF ( muep05 == m ) crel(lm,ikm) = cgc(ikm,1) - IF ( muem05 == m ) crel(lm+nlm,ikm) = cgc(ikm,2) - END IF - - END DO +CALL dscal(idim,2.d0,r2nef(1,1,1),1) +CALL daxpy(idim,-0.5D0,r2nef(1,1,1),1,r2nef(1,1,2),1) +CALL daxpy(idim,1.0D0,r2nef(1,1,2),1,r2nef(1,1,1),1) + +DO lm1=0,lmaxd1 + DO ie=1,iemxd + DO jspin=1,nspin + den_out(lm1,ie,jspin) = den(lm1,ie,jspin,1) END DO - END DO END DO -! ---------------------------------------------------------------------- -! RC transforms from REAL to COMPLEX (L,M,S) - representation -! |LC> = sum[LR] |LR> * RC(LR,LC) -! ---------------------------------------------------------------------- -CALL cinit(nkmmax*nkmmax,rc) - -w = 1.0D0/SQRT(2.0D0) +! UPDATE ANGLES +if (angle_fixed == 0) then +phi = phinew +theta = thetanew +endif -DO l = 0,lmax - DO m = -l,l - i = l*(l+1) + m + 1 - j = l*(l+1) - m + 1 - - IF ( m < 0 ) THEN - rc(i,i) = -ci*w - rc(j,i) = w - rc(i+nlm,i+nlm) = -ci*w - rc(j+nlm,i+nlm) = w - END IF - IF ( m == 0 ) THEN - rc(i,i) = c1 - rc(i+nlm,i+nlm) = c1 - END IF - IF ( m > 0 ) THEN - rc(i,i) = w*(-1.0D0)**m - rc(j,i) = ci*w*(-1.0D0)**m - rc(i+nlm,i+nlm) = w*(-1.0D0)**m - rc(j+nlm,i+nlm) = ci*w*(-1.0D0)**m - END IF - END DO -END DO +deallocate(vins) +deallocate(vnspll0) +deallocate(vnspll1) +deallocate(vnspll) +deallocate(hlk) +deallocate(jlk) +deallocate(hlk2) +deallocate(jlk2) +deallocate(tmatsph) +deallocate(tmattemp) +deallocate(alpha) +deallocate(alphaleft) +deallocate(rll) +deallocate(rllleft) +deallocate(sllleft) +deallocate(cden) +deallocate(cdenlm) +deallocate(cdenns) +deallocate(rho2nsc,rho2nsc_loop) +deallocate(rho2nsnew) +deallocate(r2nefc,r2nefc_loop) +deallocate(r2nefnew) +deallocate(r2orbc) +deallocate(cdentemp) +deallocate(den,denlm) +END SUBROUTINE rhovalnew +SUBROUTINE rhooutnew(nsra,lmmaxd,lmmaxso,lmax,gmatll,ek, & + df,cleb,icleb,iend, & + irmdnew,thetasnew,ifunm,imt1, & + lmsp,rll,ull,rllleft,sllleft, & + cden,cdenlm,cdenns,rho2nsc,corbital, & + lmaxd) + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-21 Time: 16:24:21 -! ---------------------------------------------------------------------- -! RREL transforms from REAL (L,M,S) to (KAP,MUE) - representation -! |LAM> = sum[LR] |LR> * RREL(LR,LAM) -! ---------------------------------------------------------------------- +IMPLICIT NONE -CALL zgemm('N','N',nkm,nkm,nkm,c1,rc,nkmmax,crel,nkmmax,c0,rrel, nkmmax) +INTEGER, INTENT(IN) :: nsra +INTEGER, INTENT(IN) :: lmmaxd +INTEGER, INTENT(IN) :: lmmaxso +INTEGER, INTENT(IN) :: lmax +DOUBLE COMPLEX, INTENT(IN) :: gmatll(:,:) +DOUBLE COMPLEX, INTENT(IN) :: ek +DOUBLE COMPLEX, INTENT(IN) :: df +DOUBLE PRECISION, INTENT(IN) :: cleb(:) +INTEGER, INTENT(IN) :: icleb(:,:) +INTEGER, INTENT(IN) :: iend +INTEGER, INTENT(IN) :: irmdnew +DOUBLE PRECISION, INTENT(IN) :: thetasnew(:,:) +INTEGER, INTENT(IN) :: ifunm(:) +INTEGER, INTENT(IN) :: imt1 +INTEGER, INTENT(IN) :: lmsp(:) +DOUBLE COMPLEX, INTENT(IN) :: rll(:,:,:) +DOUBLE COMPLEX, INTENT(IN) :: ull(:,:,:) +DOUBLE COMPLEX, INTENT(IN) :: rllleft(:,:,:) +DOUBLE COMPLEX, INTENT(IN) :: sllleft(:,:,:) +DOUBLE COMPLEX, INTENT(OUT) :: cden(:,0:,:) +DOUBLE COMPLEX, INTENT(OUT) :: cdenlm(:,:,:) +DOUBLE COMPLEX, INTENT(OUT) :: cdenns(:,:) +DOUBLE COMPLEX, INTENT(OUT) :: rho2nsc(:,:,:) +INTEGER, INTENT(IN) :: corbital +INTEGER, INTENT(IN) :: lmaxd -END SUBROUTINE bastrmat +DOUBLE COMPLEX, PARAMETER :: czero=(0D0,0D0) +DOUBLE COMPLEX, PARAMETER :: cone=(1D0,0D0) +DOUBLE COMPLEX cltdf -SUBROUTINE calccgc(ltab,kaptab,nmuetab,cgc,nkmax,nmuemax,nkmpmax) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-01 Time: 12:05:10 - -! ******************************************************************** -! * * -! * CLEBSCH-GORDON-COEFFICIENTS CGC(IKM,IS) * -! * * -! * IKM NUMBERS CGC FOR INCREASING K AND MUE * -! * IKM = L*2*(J+1/2) + J + MUE + 1 * -! * IS= 1/2 SPIN DOWN/UP * -! * * -! ******************************************************************** +INTEGER :: ir,jspin,lm1,lm2,lm3,m1,l1,j,ifun +DOUBLE PRECISION :: c0ll -IMPLICIT NONE +DOUBLE COMPLEX, allocatable :: wr(:,:,:),qnsi(:,:),pnsi(:,:) +INTEGER :: lmshift1(4),lmshift2(4) +DOUBLE COMPLEX, allocatable :: loperator(:,:,:) +EXTERNAL zgemm +allocate(wr(lmmaxso,lmmaxso,irmdnew)) +allocate(qnsi(lmmaxso,lmmaxso)) +allocate(pnsi(lmmaxso,lmmaxso)) +allocate(loperator(lmmaxso,lmmaxso,3)) -INTEGER, INTENT(IN) :: ltab(nmuemax) -INTEGER, INTENT(IN) :: kaptab(nmuemax) -INTEGER, INTENT(IN) :: nmuetab(nmuemax) -REAL*8, INTENT(OUT) :: cgc(nkmpmax,2) -INTEGER, INTENT(IN) :: nkmax -INTEGER, INTENT(IN) :: nmuemax -INTEGER, INTENT(IN) :: nkmpmax +wr=czero +qnsi=czero +pnsi=czero +! set LMSHIFT value which is need to construct CDEN +lmshift1(1)=0 +lmshift1(2)=lmmaxd +lmshift1(3)=0 +lmshift1(4)=lmmaxd +lmshift2(1)=0 +lmshift2(2)=lmmaxd +lmshift2(3)=lmmaxd +lmshift2(4)=0 +! for orbital moment +IF (corbital /= 0) THEN + CALL calc_orbitalmoment(lmaxd,lmmaxso,loperator) +END IF -! Local variables +c0ll=1D0/SQRT(16D0*ATAN(1D0)) +cden=czero +cdenlm=czero -INTEGER :: ikm,k,kappa,m -REAL*8 j,l,mue,twolp1 +DO ir = 1,irmdnew -ikm = 0 -DO k = 1,(nkmax+1) - l = ltab(k) - kappa = kaptab(k) - j = ABS(kappa) - 0.5D0 - mue = -j - 1.0D0 - twolp1 = 2.0D0*l + 1.0D0 - - IF ( kappa < 0 ) THEN - -! J = L + 1/2 - DO m = 1,nmuetab(k) - - mue = mue + 1.0D0 - ikm = ikm + 1 - cgc(ikm,1) = DSQRT((l-mue+0.5D0)/twolp1) - cgc(ikm,2) = DSQRT((l+mue+0.5D0)/twolp1) + DO lm1 = 1,lmmaxso + DO lm2 = 1,lmmaxso + qnsi(lm1,lm2)=sllleft(lm1,lm2,ir) + pnsi(lm1,lm2)=ull(lm1,lm2,ir) END DO - ELSE -! J = L - 1/2 - DO m = 1,nmuetab(k) - - mue = mue + 1.0D0 - ikm = ikm + 1 - cgc(ikm,1) = DSQRT((l+mue+0.5D0)/twolp1) - cgc(ikm,2) = -DSQRT((l-mue+0.5D0)/twolp1) - + END DO + CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,ek,pnsi, & + lmmaxso,qnsi,lmmaxso,czero,wr(1,1,ir),lmmaxso) + DO lm1 = 1,lmmaxso + DO lm2 = 1,lmmaxso + pnsi(lm1,lm2)=rllleft(lm1,lm2,ir) + END DO + END DO + CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,cone,pnsi, & + lmmaxso,gmatll,lmmaxso,czero,qnsi,lmmaxso) + DO lm1 = 1,lmmaxso + DO lm2 = 1,lmmaxso + pnsi(lm1,lm2)=rll(lm1,lm2,ir) + END DO + END DO + CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,cone,pnsi, & + lmmaxso,qnsi,lmmaxso,cone,wr(1,1,ir),lmmaxso) + + IF (nsra == 2) THEN + DO lm1 = 1,lmmaxso + DO lm2 = 1,lmmaxso + qnsi(lm1,lm2)=-sllleft(lm1+lmmaxso,lm2,ir) + pnsi(lm1,lm2)=ull(lm1+lmmaxso,lm2,ir) + END DO + END DO + CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,ek,pnsi, & + lmmaxso,qnsi,lmmaxso,cone,wr(1,1,ir),lmmaxso) + DO lm1 = 1,lmmaxso + DO lm2 = 1,lmmaxso + pnsi(lm1,lm2)=-rllleft(lm1+lmmaxso,lm2,ir) + END DO + END DO + CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,cone,pnsi, & + lmmaxso,gmatll,lmmaxso,czero,qnsi,lmmaxso) + DO lm1 = 1,lmmaxso + DO lm2 = 1,lmmaxso + pnsi(lm1,lm2)=rll(lm1+lmmaxso,lm2,ir) + END DO END DO + CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,cone,pnsi, & + lmmaxso,qnsi,lmmaxso,cone,wr(1,1,ir),lmmaxso) END IF +! for orbital moment + IF (corbital /= 0) THEN + CALL zgemm('N','N',lmmaxso,lmmaxso,lmmaxso,cone, & + loperator(1,1,corbital),lmmaxso,wr(1,1,ir), lmmaxso,czero,pnsi,lmmaxso) + DO lm1=1,lmmaxso + DO lm2=1,lmmaxso + wr(lm1,lm2,ir)=pnsi(lm1,lm2) + END DO + END DO + END IF -END DO - -END SUBROUTINE calccgc - -!*==cmatstr.f processed by SPAG 6.05Rc at 15:50 on 12 Oct 2002 - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-01 Time: 12:05:17 - -SUBROUTINE cmatstr(str,lstr,a,n,m,mlin,mcol,ijq,tolp,k_fmt_fil) -! ******************************************************************** -! * * -! * writes structure of COMPLEX NxN matrix A * -! * * -! * M is the actual array - size used for A * -! * MLIN/COL MODE for line and column indexing * -! * 0: plain, 1: (l,ml), 2: (l,ml,ms), 3: (kap,mue) * -! * TOL tolerance for difference * -! * IJQ if IJQ > 1000 pick IQ-JQ-block matrix * -! * assuming IJQ = IQ*1000 + JQ * -! * else: no IQ-JQ-indexing * -! * K_FMT_FIL output channel * -! * a negative sign suppresses table at the end * -! * * -! * any changes should be done in RMATSTR as well !!!!!!!!!!!!!!! * -! * * -! ******************************************************************** - -IMPLICIT COMPLEX*16(a-h,o-z) - -CHARACTER (LEN=*), INTENT(IN) :: str -INTEGER, INTENT(IN) :: lstr -COMPLEX*16, INTENT(IN OUT) :: a(m,m) -INTEGER, INTENT(IN) :: n -INTEGER, INTENT(IN) :: m -INTEGER, INTENT(IN) :: mlin -INTEGER, INTENT(IN) :: mcol -INTEGER, INTENT(IN) :: ijq -REAL*8, INTENT(IN) :: tolp -INTEGER, INTENT(IN) :: k_fmt_fil - -!*** Start of declarations rewritten by SPAG - -! PARAMETER definitions + DO jspin = 1,4 + DO lm1 = 1,lmmaxd + DO lm2 = 1,lm1-1 + wr(lm1+lmshift1(jspin),lm2+lmshift2(jspin),ir)= & + wr(lm1+lmshift1(jspin),lm2+lmshift2(jspin),ir)+ & + wr(lm2+lmshift1(jspin),lm1+lmshift2(jspin),ir) + END DO + END DO + END DO ! JSPIN + +END DO !IR -COMPLEX*16, PARAMETER :: ci=(0.0D0,1.0D0) +! first calculate the spherical symmetric contribution -! Local variables +DO l1 = 0,lmax + + DO m1 = -l1,l1 + lm1 = l1*(l1+1)+m1+1 + DO ir = 1,irmdnew + DO jspin=1,4 + cden(ir,l1,jspin) = cden(ir,l1,jspin)+ & + wr(lm1+lmshift1(jspin),lm1+lmshift2(jspin),ir) + cdenlm(ir,lm1,jspin) = wr(lm1+lmshift1(jspin),lm1+lmshift2(jspin),ir) + END DO ! JPSIN + END DO ! IR + END DO ! M1 + + DO jspin = 1,4 + DO ir = 1,irmdnew + rho2nsc(ir,1,jspin) = rho2nsc(ir,1,jspin)+ c0ll*(cden(ir,l1,jspin)*df) + END DO ! IR + + DO ir=imt1+1,irmdnew + cden(ir,l1,jspin) = cden(ir,l1,jspin)*thetasnew(ir,1)*c0ll + + DO m1 = -l1,l1 + lm1 = l1*(l1+1)+m1+1 + cdenlm(ir,lm1,jspin) = cdenlm(ir,lm1,jspin) *thetasnew(ir,1)*c0ll + END DO ! M1 + END DO ! IR + + END DO ! JSPIN + +END DO ! L1 -COMPLEX*16 b(n,n),ca,cb,arg,dtab(0:n*n) -CHARACTER (LEN=1) :: CHAR -LOGICAL :: same,small -CHARACTER (LEN=1) :: ctab(0:n*n),vz(-1:+1) -DOUBLE PRECISION :: DBLE -CHARACTER (LEN=150) :: fmt1,fmt2,fmt3,fmt4 -INTEGER :: i,i1,ic0,id,il,ilsep(20),ipt(218),iq,isl,iw(m),j, & - j0,jp,jq,k,l3,lf,mm,n1,n2,n3,nc,nd,nfil,nk,nm,nm1,nm2,nm3, nnon0,nsl -INTEGER :: ICHAR,ISIGN,nint -REAL*8 tol +cdenns=czero -!*** End of declarations rewritten by SPAG +DO j = 1,iend + lm1 = icleb(j,1) + lm2 = icleb(j,2) + lm3 = icleb(j,3) + cltdf = df*cleb(j) + + DO jspin = 1,4 + DO ir = 1,irmdnew + rho2nsc(ir,lm3,jspin) = rho2nsc(ir,lm3,jspin) + & + (cltdf*wr(lm1+lmshift1(jspin),lm2+lmshift2(jspin),ir)) + END DO + + IF (lmsp(lm3) > 0) THEN + ifun = ifunm(lm3) + DO ir=imt1+1,irmdnew + cdenns(ir,jspin) = cdenns(ir,jspin)+ & + cleb(j)*wr(lm1+lmshift1(jspin),lm2+lmshift2(jspin),ir)* & + thetasnew(ir,ifun) + END DO + END IF + END DO ! JSPIN +END DO ! J -DATA vz/'-',' ',' '/ -small(arg) = ABS(arg*tol) < 1.0D0 +deallocate(wr) +deallocate(qnsi) +deallocate(pnsi) +END SUBROUTINE rhooutnew +SUBROUTINE calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,z,c,e, & + rnew,vins,ncheb,npan_tot,rpan_intervall, & + jlk_index,hlk,jlk,hlk2,jlk2,gmatprefactor,tmat, & + use_sratrick,enable_quad_prec) + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-18 Time: 14:28:30 -same(ca,cb) = small(1.0D0-ca/cb) +IMPLICIT NONE -nfil = ABS(k_fmt_fil) +INTEGER, INTENT(IN) :: nsra +INTEGER, INTENT(IN) :: irmdnew +INTEGER, INTENT(IN OUT) :: nrmaxd +INTEGER, INTENT(IN) :: lmax +INTEGER, INTENT(IN) :: nspin +DOUBLE PRECISION, INTENT(IN) :: z +DOUBLE PRECISION, INTENT(IN) :: c +DOUBLE COMPLEX, INTENT(OUT) :: e +!INTEGER, INTENT(IN) :: lmpotd +!INTEGER, INTENT(IN OUT) :: lmmaxso +DOUBLE PRECISION, INTENT(IN) :: rnew(:) +DOUBLE PRECISION, INTENT(IN) :: vins(:,:,:) +INTEGER, INTENT(IN) :: ncheb +INTEGER, INTENT(IN) :: npan_tot +DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(0:) +INTEGER, INTENT(OUT) :: jlk_index(:) +DOUBLE COMPLEX, INTENT(IN OUT) :: hlk(:,:) +DOUBLE COMPLEX, INTENT(IN OUT) :: jlk(:,:) +DOUBLE COMPLEX, INTENT(IN OUT) :: hlk2(:,:) +DOUBLE COMPLEX, INTENT(IN OUT) :: jlk2(:,:) +DOUBLE COMPLEX, INTENT(IN OUT) :: gmatprefactor +DOUBLE COMPLEX, INTENT(IN OUT) :: tmat(:) +INTEGER, INTENT(IN OUT) :: use_sratrick +LOGICAL, INTENT(IN) :: enable_quad_prec +! construct wavefunctions for spherical potentials -tol = 1.0D0/tolp -!----------------------------------------------- set block indices IQ JQ +! local +INTEGER :: lmsize,lmsize2,nvec +INTEGER :: ivec,lval,ir,ispin,lspin,lsra,i,l1,m1,lm1 +INTEGER, allocatable :: jlk_indextemp(:) +DOUBLE COMPLEX, allocatable :: vll0(:,:,:) +DOUBLE COMPLEX, allocatable :: vll(:,:,:) +DOUBLE COMPLEX, allocatable :: rlltemp(:,:,:),ulltemp(:,:,:),slltemp(:,:,:), & + hlktemp(:,:),jlktemp(:,:), hlk2temp(:,:),jlk2temp(:,:), & + hlknew(:,:),jlknew(:,:) +DOUBLE COMPLEX, allocatable :: tmattemp(:,:) +DOUBLE COMPLEX, allocatable :: alpha(:,:) -IF ( ijq > 1000 ) THEN - iq = ijq/1000 - jq = ijq - iq*1000 - IF ( iq*n > m .OR. iq*n > m ) THEN - WRITE (6,99002) ijq,iq,jq,iq*n,jq*n,n,m - RETURN - END IF +lmsize=1 +IF (nsra == 2) THEN + lmsize2=2 + nvec=2 ELSE - iq = 1 - jq = 1 + lmsize2=1 + nvec=1 END IF +allocate (rlltemp(lmsize2,lmsize,irmdnew)) +allocate (ulltemp(lmsize2,lmsize,irmdnew)) +allocate (slltemp(lmsize2,lmsize,irmdnew)) +allocate (hlktemp(nvec,irmdnew)) +allocate (jlktemp(nvec,irmdnew)) +allocate (hlk2temp(nvec,irmdnew)) +allocate (jlk2temp(nvec,irmdnew)) +allocate (jlk_indextemp(lmsize2)) +allocate (tmattemp(lmsize,lmsize)) +allocate (alpha(lmsize,lmsize)) +allocate (hlknew(nvec*nspin*(lmax+1),irmdnew)) +allocate (jlknew(nvec*nspin*(lmax+1),irmdnew)) -!----------------------------------------------------- copy matrix block - -j0 = n*(jq-1) -DO j = 1,n - i1 = n*(iq-1)+1 - jp = j0 + j - CALL zcopy(n,a(i1,jp),1,b(1,j),1) -END DO - -!------------------------------------------------ set up character table - -nc = 0 -DO i = 1,26 - nc = nc + 1 - ipt(nc) = 62 + i -END DO -DO i = 1,8 - nc = nc + 1 - ipt(nc) = 96 + i -END DO -DO i = 10,26 - nc = nc + 1 - ipt(nc) = 96 + i -END DO -DO i = 191,218 - nc = nc + 1 - ipt(nc) = i -END DO -DO i = 35,38 - nc = nc + 1 - ipt(nc) = i -END DO -DO i = 40,42 - nc = nc + 1 - ipt(nc) = i -END DO -DO i = 91,93 - nc = nc + 1 - ipt(nc) = i +DO ivec=1,nvec + jlk_indextemp(ivec)=ivec END DO - -!---------------------------------------------------------------- header -ic0 = ICHAR('0') -n3 = n/100 -n2 = n/10 - n3*10 -n1 = n - n2*10 - n3*100 - -IF ( n <= 18 ) THEN - fmt1 = '(8X,I3,''|'',' - fmt2 = '( 9X,''--|'',' - fmt3 = '( 9X,'' #|'',' - fmt4 = '( 9X,'' |'',' +allocate(vll0(lmsize,lmsize,irmdnew)) +IF (nsra == 2) THEN + allocate(vll(2*lmsize,2*lmsize,irmdnew)) ELSE - fmt1 = '( I4,''|'',' - fmt2 = '( 2X,''--|'',' - fmt3 = '( 2X,'' #|'',' - fmt4 = '( 2X,'' |'',' + allocate(vll(lmsize,lmsize,irmdnew)) END IF - -lf = 11 -l3 = 11 -IF ( mcol == 0 ) THEN - fmt1 = fmt1(1:lf)//CHAR(ic0+n3)//CHAR(ic0+n2)//CHAR(ic0+n1) & - //'( 2A1),''|'',I3)' - fmt2 = fmt2(1:lf)//CHAR(ic0+n3)//CHAR(ic0+n2)//CHAR(ic0+n1) & - //'(''--''),''|'',I3)' - fmt3 = fmt3(1:lf)//'60(2X,I2))' - fmt4 = fmt4(1:lf)//'60(I2,2X))' - lf = 21 -ELSE - IF ( mcol == 1 ) THEN - nk = nint(SQRT(DBLE(n))) - ELSE IF ( mcol == 2 ) THEN - nk = nint(SQRT(DBLE(n/2))) - ELSE IF ( mcol == 3 ) THEN - nk = 2*nint(SQRT(DBLE(n/2))) - 1 - END IF - DO k = 1,nk - IF ( mcol <= 2 ) THEN - nm = 2*k - 1 +! spin loop +DO ispin=1,nspin + + lspin=(lmax+1)*(ispin-1) + lsra=(lmax+1)*nvec +! each value of l, the Lippmann-Schwinger equation is solved using +! the free-potential wavefunctions and potentials corresponding to l-value + DO lval=0,lmax + + DO ir=1,irmdnew + vll0(lmsize,lmsize,ir)=vins(ir,1,ispin)-2D0*z/rnew(ir) + END DO + + IF (nsra == 2) THEN + CALL vllmatsra(vll0,vll,rnew,lmsize,irmdnew,nrmaxd, & + e,c,lmax,lval,'Ref=0') ELSE - nm = 2*((k+1)/2) + vll(:,:,:)=vll0(:,:,:) END IF - nm2 = nm/10 - nm1 = nm - nm2*10 - nm3 = nm/2 - fmt1 = fmt1(1:lf)//CHAR(ic0+nm2)//CHAR(ic0+nm1) //'( 2A1),''|'',' - fmt2 = fmt2(1:lf)//CHAR(ic0+nm2)//CHAR(ic0+nm1) //'(''--''),''|'',' - IF ( mcol <= 2 ) THEN - DO mm = 1,nm - IF ( MOD(mm,2) == MOD(k,2) ) THEN - fmt3 = fmt3(1:l3)//'2X,' - fmt4 = fmt4(1:l3)//'I2,' - ELSE - fmt3 = fmt3(1:l3)//'I2,' - fmt4 = fmt4(1:l3)//'2X,' - END IF - l3 = l3 + 3 + jlktemp(1,:)=jlk(lval+1,:) + hlktemp(1,:)=hlk(lval+1,:) + jlk2temp(1,:)=jlk2(lval+1,:) + hlk2temp(1,:)=hlk2(lval+1,:) + IF (nsra == 2) THEN + jlktemp(2,:)=jlk(lmax+lval+2,:) + hlktemp(2,:)=hlk(lmax+lval+2,:) + jlk2temp(2,:)=jlk2(lmax+lval+2,:) + hlk2temp(2,:)=hlk2(lmax+lval+2,:) + END IF + CALL sll_global_solutions(rpan_intervall,rnew,vll,slltemp, & + ncheb,npan_tot,lmsize,lmsize2,nvec,irmdnew,nvec, & + jlk_indextemp,hlktemp,jlktemp,hlk2temp,jlk2temp, & + gmatprefactor,use_sratrick,enable_quad_prec,.false.) + CALL rll_global_solutions(rpan_intervall,rnew,vll,rlltemp,ulltemp,tmattemp, & + ncheb,npan_tot,lmsize,lmsize2,nvec,irmdnew,nvec, & + jlk_indextemp,hlktemp,jlktemp,hlk2temp,jlk2temp, & + gmatprefactor,use_sratrick,alpha) + + DO ir=1,irmdnew + hlknew(lspin+lval+1,ir)=slltemp(1,1,ir)/rnew(ir) + jlknew(lspin+lval+1,ir)=rlltemp(1,1,ir)/rnew(ir) + END DO + IF (nsra == 2) THEN + DO ir=1,irmdnew + hlknew(lspin+lsra+lval+1,ir)=slltemp(2,1,ir)/rnew(ir) + jlknew(lspin+lsra+lval+1,ir)=rlltemp(2,1,ir)/rnew(ir) END DO - fmt3 = fmt3(1:l3)//'''|'',' - fmt4 = fmt4(1:l3)//'''|'',' - l3 = l3 + 4 - ELSE - fmt3 = fmt3(1:lf)//CHAR(ic0+nm3)//'(2X,I2),''|'',' - fmt4 = fmt4(1:lf)//CHAR(ic0+nm3)//'(I2,2X),''|'',' - l3 = l3 + 13 END IF - lf = lf + 13 - END DO - IF ( mcol == 2 ) THEN - fmt1 = fmt1(1:lf)//fmt1(12:lf) - fmt2 = fmt2(1:lf)//fmt2(12:lf) - fmt3 = fmt3(1:l3)//fmt3(12:l3) - fmt4 = fmt4(1:l3)//fmt4(12:l3) - lf = 2*lf - 11 - l3 = 2*l3 - 11 - END IF - fmt1 = fmt1(1:lf)//'I3)' - fmt2 = fmt2(1:lf)//'I3)' - fmt3 = fmt3(1:l3)//'I3)' - fmt4 = fmt4(1:l3)//'I3)' -END IF -IF ( mlin == 0 ) THEN - nsl = 1 - ilsep(1) = n -ELSE IF ( mlin == 1 ) THEN - nsl = nint(SQRT(DBLE(n))) - DO il = 1,nsl - ilsep(il) = il**2 + tmat(lspin+lval+1)=tmattemp(1,1) + END DO ! LMAX +END DO ! NSPIN + +lm1=1 +DO ivec=1,nvec + DO i=1,2 + DO l1=0,lmax + DO m1=-l1,l1 + jlk_index(lm1)=l1+(ivec-1)*nspin*(lmax+1)+(i-1)*(lmax+1)+1 + lm1=lm1+1 + END DO + END DO END DO -ELSE IF ( mlin == 2 ) THEN - nsl = nint(SQRT(DBLE(n/2))) - DO il = 1,nsl - ilsep(il) = il**2 +END DO +DO ir=1,irmdnew + DO l1=1,nvec*(lmax+1)*nspin + hlk(l1,ir)=hlknew(l1,ir) + jlk(l1,ir)=jlknew(l1,ir) END DO - DO il = 1,nsl - ilsep(nsl+il) = ilsep(nsl) + il**2 +END DO +IF (nsra == 2) THEN + DO ir=1,irmdnew + DO l1=1,(lmax+1)*nspin + hlk2(l1,ir)=-hlknew(l1+lmax+1,ir) + jlk2(l1,ir)=-jlknew(l1+lmax+1,ir) + END DO + DO l1=nspin*(lmax+1)+1,nvec*(lmax+1)*nspin + hlk2(l1,ir)=hlknew(l1-(lmax+1)*nspin,ir) + jlk2(l1,ir)=jlknew(l1-(lmax+1)*nspin,ir) + END DO END DO - nsl = 2*nsl -ELSE IF ( mlin == 3 ) THEN - nsl = 2*nint(SQRT(DBLE(n/2))) - 1 - ilsep(1) = 2 - DO k = 2,nsl - ilsep(k) = ilsep(k-1) + 2*((k+1)/2) +ELSE + DO ir=1,irmdnew + DO l1=1,nvec*(lmax+1)*nspin + hlk2(l1,ir)=-hlknew(l1,ir) + jlk2(l1,ir)=-jlknew(l1,ir) + END DO END DO END IF +deallocate (rlltemp) +deallocate (ulltemp) +deallocate (slltemp) +deallocate (hlktemp) +deallocate (jlktemp) +deallocate (hlk2temp) +deallocate (jlk2temp) +deallocate (jlk_indextemp) +deallocate (tmattemp) +deallocate (alpha) +deallocate (hlknew) +deallocate (jlknew) +deallocate (vll0) +deallocate (vll) +END SUBROUTINE calcsph -WRITE (nfil,99001) str(1:lstr) -IF ( ijq > 1000 ) WRITE (nfil,99003) iq,jq -WRITE (nfil,fmt3) (i,i=2,n,2) -WRITE (nfil,fmt4) (i,i=1,n,2) -WRITE (nfil,FMT=fmt2) -!------------------------------------------------------------ header end -nnon0 = 0 -nd = 0 -ctab(0) = ' ' -dtab(0) = 9999D0 - -DO i = 1,n - DO j = 1,n - IF ( .NOT.small(b(i,j)) ) THEN - nnon0 = nnon0 + 1 - DO id = 1,nd - IF ( same(b(i,j),+dtab(id)) ) THEN - iw(j) = +id - GO TO 50 - END IF - IF ( same(b(i,j),-dtab(id)) ) THEN - iw(j) = -id - GO TO 50 - END IF - END DO -!----------------------------------------------------------- new element - nd = nd + 1 - iw(j) = nd - dtab(nd) = b(i,j) - IF ( ABS(dtab(nd)-1.0D0)*tol < 1.0D0 ) THEN - ctab(nd) = '1' - ELSE IF ( ABS(dtab(nd)+1.0D0)*tol < 1.0D0 ) THEN - dtab(nd) = +1.0D0 - ctab(nd) = '1' - iw(j) = -nd - ELSE IF ( ABS(dtab(nd)-ci)*tol < 1.0D0 ) THEN - ctab(nd) = 'i' - ELSE IF ( ABS(dtab(nd)+ci)*tol < 1.0D0 ) THEN - dtab(nd) = +ci - ctab(nd) = 'i' - iw(j) = -nd - ELSE - ctab(nd) = CHAR(ipt(1+MOD((nd+1),nc))) - END IF - ELSE - iw(j) = 0 - END IF - 50 END DO -!------------------------------------------------------------ write line - WRITE (nfil,FMT=fmt1) i, (vz(ISIGN(1,iw(j))),ctab(ABS(iw(j))),j=1, & - n),i - - DO isl = 1,nsl - IF ( i == ilsep(isl) ) WRITE (nfil,FMT=fmt2) - END DO -END DO + subroutine rll_global_solutions(rpanbound,rmesh,vll,rll,ull,tllp, & + ncheb,npan,lmsize,lmsize2,lbessel,nrmax, & + nvec,jlk_index,hlk,jlk,hlk2,jlk2,gmatprefactor, & + use_sratrick1, & + alpha) +! ************************************************************************ +! radial wave functions by the integral equation method of +! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) +! which has been extended for KKR using non-sperical potentials. +! Further information can be found in +! +! David Bauer, +! "Development of a relativistic full-potential first-principles multiple scattering +! Green function method applied to complex magnetic textures of nano structures +! at surfaces", PhD Thesis, 2014 +! +! http://darwin.bth.rwth-aachen.de/opus3/volltexte/2014/4925/ +! +! +! +! ************************************************************************ +! This routine solves the following two equations: +! +! ULL(r) = J(r) - PRE * J(r) * int_0^r( dr' r'^2 H2(r') * op(V(r')) * ULL(r') ) +! + PRE * H(r) * int_0^r( dr' r'^2 J2(r') * op(V(r')) * ULL(r') ) +! +! where the integral int_0^r() runs from 0 to r +! ************************************************************************ +! Potential matrix : VLL(LMSIZE*NVEC,LMSIZE*NVEC) +! LMSIZE = LMMAX (number of LM components) x Number of spin components +! LMSIZE2 = NVEC* LMSIZE +! NVEC is 2 for a spinor and 1 in case of a non-rel. calculation +! +! ************************************************************************ +! Green function prefacor PRE=GMATPREFACTOR (scalar value) +! tipically \kappa for non-relativistic and M_0 \kappa for SRA +! +! ************************************************************************ -!------------------------------------------------------------------ foot -WRITE (nfil,fmt4) (i,i=1,n,2) -WRITE (nfil,fmt3) (i,i=2,n,2) +! ************************************************************************ +! The discretization of the Lippmann-Schwinger equation results in a matrix +! equation which is solved in this routine. Further information is given +! in section 5.2.3, page 90 of Bauer, PhD +! +! Source terms : +! right solution: J, H (nvec*lmsize,lmsize) or (lmsize,nvec*lmsize) +! left solution: J2,H2 (lmsize,nvec*lmsize) or (nvec*lmsize,lmsize) +! +! Example: +! The source term J is for LMSIZE=3 and NVEC=2 given by: +! J = / jlk(jlk_index(1)) \ +! | 0 jlk(jlk_index(2)) | +! | 0 0 jlk(jlk_index(3)) | +! | jlk(jlk_index(4)) | +! | 0 jlk(jlk_index(5)) | +! \ 0 0 jlk(jlk_index(6)) / +! +! first 3 rows are for the large and the last 3 rows for the small component +! ************************************************************************ +! Operator op() can be chosen to be a unity or a transpose operation +! The unity operation is used to calculate the right solution +! The transpose operation is used to calculate the left solution +! ************************************************************************ +! RMESH - radial mesh +! RPANBOUND - panel bounds RPANBOUND(0) left panel border of panel 1 +! RPANBOUND(1) right panel border of panel 1 +! NCHEB - highes chebyshev polynomial +! number of points per panel = NCHEB + 1 +! NPAN - number of panels +! LMSIZE - number of colums for the source matrix J etc... +! LMSIZE2 - number of rows for the source matrix J etc... +! NRMAX - total number of radial points (NPAN*(NCHEB+1)) +! NVEC - number of LMSIZE*LMSIZE blocks in J (LMSIZE2=NVEC*LMSIZE) +! ************************************************************************ +implicit none + integer :: ncheb ! number of chebyshev nodes + integer :: npan ! number of panels + integer :: lmsize ! lm-components * nspin + integer :: lmsize2 ! lmsize * nvec + integer :: nvec ! spinor integer + ! nvec=1 non-rel, nvec=2 for sra and dirac + integer :: nrmax ! total number of rad. mesh points + integer :: LBESSEL, use_sratrick1 -IF ( k_fmt_fil > 0 ) THEN - WRITE (nfil,99004) (id,ctab(id),dtab(id),id=1,nd) - WRITE (nfil,99005) nnon0,tolp,n*n - nnon0,tolp -ELSE - WRITE (nfil,*) ' ' -END IF + double complex,parameter:: ci= (0.0d0,1.0d0), &! complex i + cone=(1.0d0,0.0d0),&! 1 + czero=(0.0d0,0.0d0) ! 0 + ! running indices + integer lm1,lm2 + integer info,icheb,ipan,mn,nm -99001 FORMAT (/,8X,a,/) -99002 FORMAT (/,1X,79('*'),/,10X,'inconsistent call of <CMATSTR>',/,10X, & - 'argument IJQ =',i8,' implies IQ=',i3,' JQ=',i3,/,10X, & - 'IQ*N=',i6,' > M or JQ*N=',i6,' > M for N =',i4, & - ' M=',i4,/,1X,79('*'),/) -99003 FORMAT (8X,'IQ-JQ-block for IQ = ',i3,' JQ = ',i3,/) -99004 FORMAT (/,8X,'symbols used:',/,(8X,i3,3X,a1,2X,2F20.12)) -99005 FORMAT (/,8X,i5,' elements >',1PE9.1,/, & - 8X,i5,' elements <',1PE9.1,/) -END SUBROUTINE cmatstr + ! source terms + double complex :: gmatprefactor ! prefactor of green function + ! non-rel: = kappa = sqrt e + DOUBLE COMPLEX :: HLK(LBESSEL,NRMAX), & + JLK(LBESSEL,NRMAX), & + HLK2(LBESSEL,NRMAX), & + JLK2(LBESSEL,NRMAX) -FUNCTION ikapmue(kappa,muem05) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-01 Time: 12:21:58 + INTEGER JLK_INDEX(2*LMSIZE) -! ******************************************************************** -! * * -! * INDEXING OF MATRIX-ELEMENTS: * -! * * -! * I = 2*L*(J+1/2) + J + MUE + 1 * -! * * -! ******************************************************************** + double complex :: rll(lmsize2,lmsize,nrmax), & ! reg. fredholm sol. + ull(lmsize2,lmsize,nrmax), & ! reg. volterra sol. + tllp(lmsize,lmsize), & ! t-matrix + vll(lmsize*nvec,lmsize*nvec,nrmax) ! potential term in 5.7 + ! bauer, phd + double complex,allocatable :: & + work(:,:), & + allp(:,:,:),bllp(:,:,:), & ! eq. 5.9, 5.10 for reg. sol + mrnvy(:,:,:),mrnvz(:,:,:), & ! + mrjvy(:,:,:),mrjvz(:,:,:), & ! eq. 5.19-5.22 + vhlr(:,:,:), & ! vhlr = h * v (regular sol.) + vjlr(:,:,:) ! vjlr = j * v (regular sol.) + double complex,allocatable :: yrf(:,:,:,:), zrf(:,:,:,:) ! + ! chebyshev arrays + double precision c1(0:ncheb,0:ncheb),rpanbound(0:npan) + double precision cslc1(0:ncheb,0:ncheb), & ! Integration matrix from left ( C*S_L*C^-1 in eq. 5.53) + csrc1(0:ncheb,0:ncheb), & ! Same from right ( C*S_R*C^-1 in eq. 5.54) + tau(0:ncheb,0:npan), & ! Radial mesh point + slc1sum(0:ncheb),rmesh(nrmax),drpan2 -IMPLICIT NONE + integer ipiv(0:ncheb,lmsize2) + integer,allocatable :: ipiv2(:) + integer :: use_sratrick + integer,parameter :: directsolv=1 + double complex alpha(lmsize,lmsize) -INTEGER, INTENT(IN) :: kappa -INTEGER, INTENT(IN) :: muem05 + external zgetrf,zgetrs,zgemm + intrinsic abs,atan,cos,dimag,exp,max,min,sin,sqrt +! *********************************************************************** +! SRA trick +! *********************************************************************** +! on page 68 of Bauer, PhD, a method is described how to speed up the +! calculations in case of the SRA. A similar approach is implemented +! here by using Eq. 4.132 and substituting DV from 4.133, and discretising +! the radial mesh of the Lippmann-Schwinger eq. according to 5.68. +! The Lippmann-Schwinger equation leads to a matrix inversion +! problem. The matrix M which needs to be inverted has a special form +! if the SRA approximation is used: +! +! matrix A ( C 0) (same as in eq. 5.68) +! ( B 1) +! (C, B are matricies here) +! +! inverse of A is (C^-1 0 ) +! (-B C^-1 1 ) +! Thus, it is sufficient to only inverse the matrix C which saves computational +! time. This is refered to as the SRA trick. +! *********************************************************************** +! in future implementation equation 4.134 is supposed to be +! implemented which should lead to an additional speed-up. +! *********************************************************************** -! Dummy arguments +if ( lmsize==1 ) then + use_sratrick=0 +else + use_sratrick=use_sratrick1 +end if +do ipan = 1,npan + do icheb = 0,ncheb + mn = ipan*ncheb + ipan - icheb + tau(icheb,ipan) = rmesh(mn) + end do +end do -INTEGER :: ikapmue +call chebint(cslc1,csrc1,slc1sum,c1,ncheb) -! Local variables +if(.not.allocated(work)) allocate( work(lmsize,lmsize) ) +if(.not.allocated(allp)) allocate( allp(lmsize,lmsize,0:npan), bllp(lmsize,lmsize,0:npan) ) +if(.not.allocated(mrnvy)) allocate( mrnvy(lmsize,lmsize,npan), mrnvz(lmsize,lmsize,npan) ) +if(.not.allocated(mrjvy)) allocate( mrjvy(lmsize,lmsize,npan), mrjvz(lmsize,lmsize,npan) ) +if(.not.allocated(vjlr)) allocate( vjlr(lmsize,lmsize2,0:ncheb), vhlr(lmsize,lmsize2,0:ncheb) ) -INTEGER :: IABS -INTEGER :: jp05,l +if(.not.allocated(yrf)) allocate( yrf(lmsize2,lmsize,0:ncheb,npan) ) +if(.not.allocated(zrf)) allocate( zrf(lmsize2,lmsize,0:ncheb,npan) ) -jp05 = IABS(kappa) + do ipan = 1, npan -IF ( kappa < 0 ) THEN - l = -kappa - 1 -ELSE - l = kappa -END IF + drpan2 = (rpanbound(ipan)-rpanbound(ipan-1))/2.0d0 ! *(b-a)/2 in eq. 5.53, 5.54 + call rll_local_solutions(vll,tau(0,ipan),drpan2,cslc1,slc1sum,mrnvy(1,1,ipan),& + mrnvz(1,1,ipan),mrjvy(1,1,ipan),mrjvz(1,1,ipan),yrf(1,1,0,ipan), & + zrf(1,1,0,ipan),ncheb,ipan,lmsize,lmsize2,nrmax,nvec,jlk_index,hlk,jlk,hlk2,& + jlk2,gmatprefactor,lbessel,use_sratrick1) -ikapmue = 2*l*jp05 + jp05 + muem05 + 1 + end do ! ipan -END FUNCTION ikapmue +! *********************************************************************** +! calculate A(M), B(M), C(M), D(M) +! according to 5.17-5.18 (regular solution) of Bauer PhD +! C,D are calculated accordingly for the irregular solution +! (starting condition: A(0) = 1, B(0) = 0, C(MMAX) = 0 and D(MMAX) = 1) +! *********************************************************************** +! regular +do lm2 = 1,lmsize + do lm1 = 1,lmsize + bllp(lm1,lm2,0) = czero + allp(lm1,lm2,0) = czero + end do +end do -SUBROUTINE ikmlin(iprint,nsollm,ikm1lin,ikm2lin,nlmax,nmuemax, & - linmax,nl) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-01 Time: 12:05:20 +do lm1 = 1,lmsize + allp(lm1,lm1,0) = cone +end do -! ******************************************************************** -! * * -! * SETUP TABLE OF INDICES IKM(INT) * -! * * -! * IKM IS STANDARD INDEX IN (KAPPA,MUE)-REPRESENTATION * -! * IKM = 2*L*(J+1/2) + J + MUE + 1 * -! * * -! * INT NUMBERS LINEARLY ONLY NON-VANISHING ELEMENTS OF M-SS * -! * USED TO CALCULATE DOS ... * -! * * -! ******************************************************************** +do ipan = 1,npan + call zcopy(lmsize*lmsize,allp(1,1,ipan-1),1,allp(1,1,ipan),1) + call zcopy(lmsize*lmsize,bllp(1,1,ipan-1),1,bllp(1,1,ipan),1) + call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mrnvy(1,1,ipan), & + lmsize,allp(1,1,ipan-1),lmsize,cone,allp(1,1,ipan),lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mrnvz(1,1,ipan), & + lmsize,bllp(1,1,ipan-1),lmsize,cone,allp(1,1,ipan),lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize, cone,mrjvy(1,1,ipan), & + lmsize,allp(1,1,ipan-1),lmsize,cone,bllp(1,1,ipan),lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize, cone,mrjvz(1,1,ipan), & + lMSIZE,BLLP(1,1,IPAN-1),LMSIZE,CONE,BLLP(1,1,IPAN),LMSIZE) +end do -IMPLICIT NONE +! *********************************************************************** +! determine the regular solution ull by using 5.14 +! *********************************************************************** +do ipan = 1,npan + do icheb = 0,ncheb + mn = ipan*ncheb + ipan - icheb + call zgemm('n','n',lmsize2,lmsize,lmsize,cone,yrf(1,1,icheb,ipan), & + lmsize2,allp(1,1,ipan-1),lmsize,czero,ull(1,1,mn),lmsize2) + call zgemm('n','n',lmsize2,lmsize,lmsize,cone,zrf(1,1,icheb,ipan), & + lmsize2,bllp(1,1,ipan-1),lmsize,cone,ull(1,1,mn),lmsize2) + end do +end do -INTEGER, INTENT(IN) :: iprint -INTEGER, INTENT(IN) :: nsollm(nlmax,nmuemax) -INTEGER, INTENT(OUT) :: ikm1lin(linmax) -INTEGER, INTENT(OUT) :: ikm2lin(linmax) -INTEGER, INTENT(IN) :: nlmax -INTEGER, INTENT(IN) :: nmuemax -INTEGER, INTENT(IN) :: linmax -INTEGER, INTENT(IN) :: nl +! *********************************************************************** +! next part converts the volterra solution u of equation (5.7) to +! the fredholm solution r by employing eq. 4.122 and 4.120 of bauer, phd +! and the t-matrix is calculated +! *********************************************************************** +call zgetrf(lmsize,lmsize,allp(1,1,npan),lmsize,ipiv,info) !invert alpha +call zgetri(lmsize,allp(1,1,npan),lmsize,ipiv,work,lmsize*lmsize,info) !invert alpha -> transformation matrix rll=alpha^-1*rll -! Dummy arguments + alpha=allp(:,:,npan) ! LLY +! calculation of the t-matrix +call zgemm('n','n',lmsize,lmsize,lmsize,cone/gmatprefactor,bllp(1,1,npan), & ! calc t-matrix tll = bll*alpha^-1 + lmsize,allp(1,1,npan),lmsize,czero,tllp,lmsize) +do nm = 1,nrmax +call zgemm('n','n',lmsize2,lmsize,lmsize,cone,ull(1,1,nm), & + lmsize2,allp(1,1,npan),lmsize,czero,rll(1,1,nm),lmsize2) +end do +if(allocated(work)) deallocate( work ) +if(allocated(allp)) deallocate( allp, bllp ) +if(allocated(mrnvy)) deallocate( mrnvy, mrnvz ) +if(allocated(mrjvy)) deallocate( mrjvy, mrjvz ) +if(allocated(vjlr)) deallocate( vjlr, vhlr ) -! Local variables +if(allocated(yrf)) deallocate( yrf ) +if(allocated(zrf)) deallocate( zrf ) -INTEGER :: i,il,imue,k1,k2,kap(2),l,lin,muem05,nsol -!INTEGER :: ikapmue +end subroutine rll_global_solutions -lin = 0 + subroutine rll_local_solutions(vll,tau,drpan2,cslc1,slc1sum, & + mrnvy,mrnvz,mrjvy,mrjvz, & + yrf,zrf, & + ncheb,ipan,lmsize,lmsize2,nrmax, & + nvec,jlk_index,hlk,jlk,hlk2,jlk2,gmatprefactor, & + LBESSEL,use_sratrick1) +implicit none + integer :: ncheb ! number of chebyshev nodes + integer :: lmsize ! lm-components * nspin + integer :: lmsize2 ! lmsize * nvec + integer :: nvec ! spinor integer +! nvec=1 non-rel, nvec=2 for sra and dirac + integer :: nrmax ! total number of rad. mesh points -DO il = 1,nl - l = il - 1 - muem05 = -il - 1 - kap(1) = -l - 1 - kap(2) = +l - - DO imue = 1,2*il - muem05 = muem05 + 1 - nsol = nsollm(il,imue) - - DO k2 = 1,nsol - DO k1 = 1,nsol - lin = lin + 1 - ikm1lin(lin) = ikapmue(kap(k1),muem05) - ikm2lin(lin) = ikapmue(kap(k2),muem05) - END DO - END DO - - END DO -END DO + integer :: LBESSEL, use_sratrick1 ! dimensions etc., needed only for host code interface -IF ( iprint < 2 ) RETURN -WRITE (6,FMT='('' INT='',I3,'' IKM=('',I3,'','',I3,'')'')') & - (i,ikm1lin(i),ikm2lin(i),i=1,lin) -END SUBROUTINE ikmlin -!*********************************************************************** - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-01 Time: 12:26:23 + double complex,parameter:: cone=(1.0d0,0.0d0),czero=(0.0d0,0.0d0) +! running indices + integer ivec, ivec2 + integer l1,l2,lm1,lm2,lm3 + integer info,icheb2,icheb,ipan,mn,nplm -SUBROUTINE splint_real(xa,ya,y2a,n,x,y,yderiv) +! source terms + double complex :: gmatprefactor ! prefactor of green function +! non-rel: = kappa = sqrt e -IMPLICIT NONE + DOUBLE COMPLEX :: HLK(LBESSEL,NRMAX), & + JLK(LBESSEL,NRMAX), & + HLK2(LBESSEL,NRMAX), & + JLK2(LBESSEL,NRMAX) -REAL*8, INTENT(IN) :: xa(*) -REAL*8, INTENT(IN) :: ya(*) -REAL*8, INTENT(IN OUT) :: y2a(*) -INTEGER, INTENT(IN) :: n -REAL*8, INTENT(IN) :: x -REAL*8, INTENT(OUT) :: y -REAL*8, INTENT(OUT) :: yderiv - - -! Given the arrays xa(1:n) and ya(1:n) of length n, which tabulate a -! function (with the xai's in order), and given the array y2a(1:n), which -! is the output from spline above, and given a value of x, this routine -! returns a cubic-spline interpolated value y and the derivative yderiv. -! Taken from "Numerical Recipes in Fortran 77", W.H.Press et al. -INTEGER :: k,khi,klo -REAL*8 a,b,h -! We will nd the right place in the table by means of bisection. -! This is optimal if sequential calls to this routine are at random -! values of x. If sequential calls are in order, and closely -! spaced, one would do better to store previous values of -! klo and khi and test if they remain appropriate on the -! next call. -klo=1 -khi=n -1 IF (khi-klo > 1) THEN - k=(khi+klo)/2 - IF(xa(k) > x)THEN - khi=k - ELSE - klo=k - END IF - GO TO 1 -END IF -! klo and khi now bracket the input value of x. -h=xa(khi)-xa(klo) -! The xa's must be distinct. -IF (h == 0.d0) PAUSE 'bad xa input in splint' -! Cubic spline polynomial is now evaluated. -a = (xa(khi)-x)/h -b = (x-xa(klo))/h -y = a*ya(klo) + b*ya(khi) + & - ((a**3-a)*y2a(klo)+(b**3-b)*y2a(khi)) * (h**2)/6.d0 -yderiv = (ya(khi)-ya(klo))/h - & - ((3.d0*a*a-1.d0)*y2a(klo) - (3.d0*b*b-1.d0)*y2a(khi))*h/6.d0 -RETURN -END SUBROUTINE splint_real + INTEGER JLK_INDEX(2*LMSIZE) -SUBROUTINE interpolspline(rmesh,rmeshnew,vpot,vpotnew, & - nrmax,nrmaxnew) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-01 Time: 12:05:24 - -IMPLICIT NONE -!interface -INTEGER :: nrmax -INTEGER :: nrmaxnew -DOUBLE PRECISION :: rmesh(nrmax) -DOUBLE PRECISION :: rmeshnew(nrmaxnew) -DOUBLE PRECISION :: vpot(nrmax) -DOUBLE PRECISION :: vpotnew(nrmaxnew) -!local -DOUBLE PRECISION :: maxa -DOUBLE PRECISION :: spline(nrmax) -DOUBLE PRECISION :: parsum, parsumderiv,r0 -INTEGER :: ir -maxa = 1.d35 -CALL spline_real(nrmax,rmesh,vpot,nrmax,maxa,maxa,spline) -! CALL SPLINE(IRMDJJ,R,VM2Z,NR,maxa,maxa,VM2ZB) - -DO ir = 1,nrmaxnew - r0 = rmeshnew(ir) - CALL splint_real(rmesh,vpot,spline,nrmax,r0,parsum,parsumderiv) - vpotnew(ir) = parsum -END DO -END SUBROUTINE interpolspline + double complex :: vll(lmsize*nvec,lmsize*nvec,nrmax) ! potential term in 5.7 + + double complex :: & + mrnvy(lmsize,lmsize),mrnvz(lmsize,lmsize), & + mrjvy(lmsize,lmsize),mrjvz(lmsize,lmsize), & + yrf(lmsize2,lmsize,0:ncheb), & + zrf(lmsize2,lmsize,0:ncheb) + double complex :: & + slv(0:ncheb,lmsize2,0:ncheb,lmsize2), & + slv1(0:ncheb,lmsize,0:ncheb,lmsize), & + yrll1(0:ncheb,lmsize,lmsize), zrll1(0:ncheb,lmsize,lmsize), & + yrll2(0:ncheb,lmsize,lmsize), zrll2(0:ncheb,lmsize,lmsize), & + yrll(0:ncheb,lmsize2,lmsize), zrll(0:ncheb,lmsize2,lmsize), & + vjlr(lmsize,lmsize2,0:ncheb), vhlr(lmsize,lmsize2,0:ncheb), & + vjlr_yrll1(lmsize,lmsize), vhlr_yrll1(lmsize,lmsize), & + vjlr_zrll1(lmsize,lmsize), vhlr_zrll1(lmsize,lmsize), & + yrll1temp(lmsize,lmsize), zrll1temp(lmsize,lmsize) + + double complex :: & + jlmkmn(0:ncheb,lmsize2,0:ncheb), & + hlmkmn(0:ncheb,lmsize2,0:ncheb) + +! chebyshev arrays + double complex zslc1sum(0:ncheb) + double precision drpan2 + double precision cslc1(0:ncheb,0:ncheb), & ! Integration matrix from left ( C*S_L*C^-1 in eq. 5.53) + tau(0:ncheb), & ! Radial mesh point + slc1sum(0:ncheb),taucslcr,tau_icheb + double complex :: gf_tau_icheb -SUBROUTINE strsmat(lmax,cgc,srrel,nrrel,irrel,nkmmax,nkmpmax) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-01 Time: 12:05:34 - -! ******************************************************************** -! * * -! * INITIALIZE TRANSFORMATION MATRIX THAT TAKES MATRICES FROM * -! * RELATIVISTIC TO REAL SPERICAL HARM. REPRESENTATION * -! * * -! * ONLY THE NON-0 ELEMENTS OF THE MATRIX ARE STORED * -! * * -! * 25/10/95 HE proper convention of trans. matrix introduced * -! ******************************************************************** + integer ipiv(0:ncheb,lmsize2) + integer :: use_sratrick -IMPLICIT NONE + external zgetrf,zgetrs,zgemm -INTEGER, INTENT(IN) :: lmax -REAL*8, INTENT(IN) :: cgc(nkmpmax,2) -COMPLEX*16, INTENT(OUT) :: srrel(2,2,nkmmax) -INTEGER, INTENT(OUT) :: nrrel(2,nkmmax) -INTEGER, INTENT(OUT) :: irrel(2,2,nkmmax) -INTEGER, INTENT(IN) :: nkmmax -INTEGER, INTENT(IN) :: nkmpmax +if ( lmsize==1 ) then + use_sratrick=0 +else + use_sratrick=use_sratrick1 +end if -! PARAMETER definitions +! initialization + + vhlr=czero + vjlr=czero -COMPLEX*16, PARAMETER :: ci=(0.0D0,1.0D0) -COMPLEX*16, PARAMETER :: c1=(1.0D0,0.0D0) -COMPLEX*16, PARAMETER :: c0=(0.0D0,0.0D0) + if (use_sratrick==0) then + yrll=czero + zrll=czero + else + yrll1=czero + zrll1=czero + yrll2=czero + zrll2=czero + end if -! Dummy arguments +!--------------------------------------------------------------------- +! 1. prepare VJLR, VNL, VHLR, which appear in the integrands +! TAU(K,IPAN) is used instead of TAU(K,IPAN)**2, which directly gives +! RLL(r) and SLL(r) multiplied with r. TAU is the radial mesh. +! +! 2. prepare the source terms YR, ZR, YI, ZI +! because of the conventions used by +! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) +! a factor sqrt(E) is included in the source terms +! this factor is removed by the definition of ZSLC1SUM given below +! +!vjlr = \kappa * J * V = \kappa * r * j *V +!vhlr = \kappa * H * V = \kappa * r * h *V +! +! i.e. prepare terms kappa*J*DV, kappa*H*DV appearing in 5.11, 5.12. + do icheb = 0,ncheb + mn = ipan*ncheb + ipan - icheb + tau_icheb = tau(icheb) + gf_tau_icheb = gmatprefactor*tau_icheb + do ivec2=1,nvec + do lm2 = 1,lmsize + do ivec=1,nvec + do lm1 = 1,lmsize + l1 = jlk_index( lm1+lmsize*(ivec-1) ) + vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & + gf_tau_icheb*jlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) + vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & + gf_tau_icheb*hlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) + end do + end do + end do + end do +! calculation of the J (and H) matrix according to equation 5.69 (2nd eq.) + if ( use_sratrick==0 ) then + do ivec=1,nvec ! index for large/small component + do lm1 = 1,lmsize + l1 = jlk_index( lm1+lmsize*(ivec-1) ) + yrll(icheb,lm1+lmsize*(ivec-1),lm1) = tau_icheb*jlk(l1,mn) + zrll(icheb,lm1+lmsize*(ivec-1),lm1) = tau_icheb*hlk(l1,mn) + end do + end do !ivec=1,nvec + elseif ( use_sratrick==1 ) then + do lm1 = 1,lmsize + l1 = jlk_index( lm1+lmsize*(1-1) ) + l2 = jlk_index( lm1+lmsize*(2-1) ) + yrll1(icheb,lm1+lmsize*(1-1),lm1) = tau_icheb*jlk(l1,mn) + zrll1(icheb,lm1+lmsize*(1-1),lm1) = tau_icheb*hlk(l1,mn) + yrll2(icheb,lm1+lmsize*(1-1),lm1) = tau_icheb*jlk(l2,mn) + zrll2(icheb,lm1+lmsize*(1-1),lm1) = tau_icheb*hlk(l2,mn) + end do + end if + end do ! icheb +! calculation of A in 5.68 + if ( use_sratrick==0 ) then + do icheb2 = 0,ncheb + do icheb = 0,ncheb + taucslcr = tau(icheb)*cslc1(icheb,icheb2)*drpan2 + mn = ipan*ncheb + ipan - icheb + do lm2 = 1,lmsize2 + do ivec=1,nvec + do lm3 = 1,lmsize + lm1=lm3+(ivec-1)*lmsize + l1 = jlk_index(lm1) + slv(icheb,lm1,icheb2,lm2) = & + taucslcr*(jlk(l1,mn)*vhlr(lm3,lm2,icheb2) & + -hlk(l1,mn)*vjlr(lm3,lm2,icheb2)) + end do + end do + end do + end do + end do + do lm1 = 1,lmsize2 + do icheb = 0,ncheb + slv(icheb,lm1,icheb,lm1) = slv(icheb,lm1,icheb,lm1) + 1.d0 + end do + end do + elseif ( use_sratrick==1 ) then + do icheb2 = 0,ncheb + do icheb = 0,ncheb + taucslcr = tau(icheb)*cslc1(icheb,icheb2)*drpan2 + mn = ipan*ncheb + ipan - icheb + do lm1 = 1,lmsize + l1 = jlk_index(lm1) + jlmkmn(icheb,lm1,icheb2) = - taucslcr*jlk(l1,mn) + hlmkmn(icheb,lm1,icheb2) = - taucslcr*hlk(l1,mn) + end do + end do + end do + do lm2 = 1,lmsize + do icheb2 = 0,ncheb + do lm1 = 1,lmsize + do icheb = 0,ncheb + slv1(icheb,lm1,icheb2,lm2) = & + -jlmkmn(icheb,lm1,icheb2)*vhlr(lm1,lm2,icheb2) & + +hlmkmn(icheb,lm1,icheb2)*vjlr(lm1,lm2,icheb2) + end do + end do + end do + end do -! Local variables + do lm1 = 1,lmsize + do icheb = 0,ncheb + slv1(icheb,lm1,icheb,lm1) = slv1(icheb,lm1,icheb,lm1) + 1.d0 + end do + end do -COMPLEX*16 crel(nkmmax,nkmmax),rc(nkmmax,nkmmax), rrel(nkmmax,nkmmax) -INTEGER :: i,ikm,j,jp05,k,l,lam,lm,lnr,lr,m,muem05,muep05,nk,nkm,nlm, ns1,ns2 -REAL*8 w + else + stop '[rllsll] error in inversion' + end if -nk = 2*(lmax+1) + 1 -nlm = (lmax+1)**2 -nkm = 2*nlm -! =================================================== -! INDEXING: -! IKM = L*2*(J+1/2) + J + MUE + 1 -! LM = L*(L+1) + M + 1 -! =================================================== +!------------------------------------------------------- +! determine the local solutions +! solve the equations SLV*YRLL=S and SLV*ZRLL=C +! and SRV*YILL=C and SRV*ZILL=S +! i.e., solve system A*U=J, see eq. 5.68. -! ---------------------------------------------------------------------- -! CREL transforms from COMPLEX (L,M,S) to (KAP,MUE) - representation -! |LAM> = sum[LC] |LC> * CREL(LC,LAM) -! ---------------------------------------------------------------------- -CALL cinit(nkmmax*nkmmax,crel) - -lm = 0 -DO lnr = 0,lmax - DO m = -lnr,lnr - lm = lm + 1 - - ikm = 0 - DO k = 1,nk - l = k/2 - IF ( 2*l == k ) THEN - jp05 = l - ELSE - jp05 = l + 1 - END IF - - DO muem05 = -jp05,(jp05-1) - muep05 = muem05 + 1 - ikm = ikm + 1 - - IF ( l == lnr ) THEN - IF ( muep05 == m ) crel(lm,ikm) = cgc(ikm,1) - IF ( muem05 == m ) crel(lm+nlm,ikm) = cgc(ikm,2) - END IF - - END DO - END DO - - END DO -END DO - -! ---------------------------------------------------------------------- -! RC transforms from REAL to COMPLEX (L,M,S) - representation -! |LC> = sum[LR] |LR> * RC(LR,LC) -! ---------------------------------------------------------------------- -CALL cinit(nkmmax*nkmmax,rc) - -w = 1.0D0/SQRT(2.0D0) - -DO l = 0,lmax - DO m = -l,l - i = l*(l+1) + m + 1 - j = l*(l+1) - m + 1 - - IF ( m < 0 ) THEN - rc(i,i) = -ci*w - rc(j,i) = w - rc(i+nlm,i+nlm) = -ci*w - rc(j+nlm,i+nlm) = w - END IF - IF ( m == 0 ) THEN - rc(i,i) = c1 - rc(i+nlm,i+nlm) = c1 - END IF - IF ( m > 0 ) THEN - rc(i,i) = w*(-1.0D0)**m - rc(j,i) = ci*w*(-1.0D0)**m - rc(i+nlm,i+nlm) = w*(-1.0D0)**m - rc(j+nlm,i+nlm) = ci*w*(-1.0D0)**m - END IF - END DO -END DO - -! ---------------------------------------------------------------------- -! RREL transforms from REAL (L,M,S) to (KAP,MUE) - representation -! |LAM> = sum[LR] |LR> * RREL(LR,LAM) -! ---------------------------------------------------------------------- -CALL zgemm('N','N',nkm,nkm,nkm,c1,rc,nkmmax,crel,nkmmax,c0,rrel, nkmmax) + if ( use_sratrick==0 ) then + nplm = (ncheb+1)*lmsize2 -! --------------------------------------------------- -! store the elements of RREL -! --------------------------------------------------- -DO lam = 1,nkm - ns1 = 0 - ns2 = 0 - - DO lr = 1,2*nlm - IF ( CDABS(rrel(lr,lam)) > 1D-6 ) THEN - IF ( lr <= nlm ) THEN - ns1 = ns1 + 1 - IF ( ns1 > 2 ) STOP ' IN <STRSMAT> NS1 > 2' - srrel(ns1,1,lam) = rrel(lr,lam) - irrel(ns1,1,lam) = lr - ELSE - ns2 = ns2 + 1 - IF ( ns2 > 2 ) STOP ' IN <STRSMAT> NS2 > 2' - srrel(ns2,2,lam) = rrel(lr,lam) - irrel(ns2,2,lam) = lr - nlm - END IF - END IF - END DO - - nrrel(1,lam) = ns1 - nrrel(2,lam) = ns2 -END DO + call zgetrf(nplm,nplm,slv,nplm,ipiv,info) + if (info/=0) stop 'rllsll: zgetrf' + call zgetrs('n',nplm,lmsize,slv,nplm,ipiv,yrll,nplm,info) + call zgetrs('n',nplm,lmsize,slv,nplm,ipiv,zrll,nplm,info) -END SUBROUTINE strsmat + elseif ( use_sratrick==1 ) then + nplm = (ncheb+1)*lmsize + call zgetrf(nplm,nplm,slv1,nplm,ipiv,info) + call zgetrs('n',nplm,lmsize,slv1,nplm,ipiv,yrll1,nplm,info) + call zgetrs('n',nplm,lmsize,slv1,nplm,ipiv,zrll1,nplm,info) -!*********************************************************************** - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-01 Time: 12:22:03 + do icheb2 = 0,ncheb + do lm2 = 1,lmsize + do lm1 = 1,lmsize + yrll1temp(lm1,lm2) = yrll1(icheb2,lm1,lm2) + zrll1temp(lm1,lm2) = zrll1(icheb2,lm1,lm2) + end do + end do + call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhlr(1,1,icheb2), & + lmsize,yrll1temp,lmsize,czero,vhlr_yrll1,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhlr(1,1,icheb2), & + lmsize,zrll1temp,lmsize,czero,vhlr_zrll1,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjlr(1,1,icheb2), & + lmsize,yrll1temp,lmsize,czero,vjlr_yrll1,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjlr(1,1,icheb2), & + lmsize,zrll1temp,lmsize,czero,vjlr_zrll1,lmsize) -SUBROUTINE spline_real(nmax,x,y,n,yp1,ypn,y2) + do icheb = 0,ncheb + taucslcr = - tau(icheb)*cslc1(icheb,icheb2)*drpan2 + mn = ipan*ncheb + ipan - icheb + do lm2 = 1,lmsize + do lm3 = 1,lmsize + lm1=lm3+lmsize + l1 = jlk_index(lm1) -IMPLICIT NONE + yrll2(icheb,lm3,lm2) = & + yrll2(icheb,lm3,lm2) + & + taucslcr*(jlk(l1,mn)*vhlr_yrll1(lm3,lm2) & + -hlk(l1,mn)*vjlr_yrll1(lm3,lm2)) -INTEGER, INTENT(IN) :: nmax -REAL*8, INTENT(IN) :: x(nmax) -REAL*8, INTENT(IN) :: y(nmax) -INTEGER, INTENT(IN) :: n -REAL*8, INTENT(IN OUT) :: yp1 -REAL*8, INTENT(IN OUT) :: ypn -REAL*8, INTENT(OUT) :: y2(nmax) - - -! REAL*8 x(NMAX) -! COMPLEX yp1,ypn,y(NMAX),y2(NMAX) -! Given arrays x(1:n) and y(1:n) containing a tabulated function, -! i.e., y i = f(xi), with x1<x2<...<xN , and given values yp1 and ypn -! for the 1rst derivative of the interpolating function at points -! 1 and n, respectively, this routine returns an array y2(1:n) of -! length n which contains the second derivatives of the interpolating -! function at the tabulated points xi. -! If yp1 and/or ypn are equal to 1.e30 or larger, the routine is -! signaled to set the corresponding boundary condition for a natural -! spline, with zero second derivative on that boundary. -! Parameter: NMAX is the largest anticipated value of n. -! Taken from "Numerical Recipes in Fortran 77", W.H.Press et al. -INTEGER :: i,k -REAL*8 p,qn,sig,un,u(nmax) -! COMPLEX p,qn,sig,un,u(NMAX) - -IF (n > nmax) STOP 'SPLINE: n > NMAX.' -IF (ABS(yp1) > 0.99D30) THEN -! The lower boundary condition is set either to be "natural" - y2(1) = 0.d0 - u(1) = 0.d0 -ELSE -! or else to have a specified first derivative. - y2(1) = -0.5D0 - u(1)=(3.d0/(x(2)-x(1)))*((y(2)-y(1))/(x(2)-x(1))-yp1) -END IF + zrll2(icheb,lm3,lm2) = & + zrll2(icheb,lm3,lm2) + & + taucslcr*(jlk(l1,mn)*vhlr_zrll1(lm3,lm2) & + -hlk(l1,mn)*vjlr_zrll1(lm3,lm2)) -DO i = 2,n-1 -! This is the decomposition loop of the tridiagonal algorithm. y2 and u -! are used for temporary storage of the decomposed factors. - sig = (x(i)-x(i-1)) / (x(i+1)-x(i-1)) - p = sig * y2(i-1) + 2.d0 - y2(i) = (sig-1.d0)/p - u(i)=(6.d0*((y(i+1)-y(i))/(x(i+1)-x(i))-(y(i)-y(i-1)) & - /(x(i)-x(i-1)))/(x(i+1)-x(i-1))-sig*u(i-1)) / p -END DO + end do + end do + end do + end do -IF (ABS(ypn) > 0.99D30) THEN -! The upper boundary condition is set either to be "natural" - qn = 0.d0 - un = 0.d0 -ELSE -! or else to have a specified 1rst derivative. - qn = 0.5D0 - un = (3.d0/(x(n)-x(n-1)))*(ypn-(y(n)-y(n-1))/(x(n)-x(n-1))) -END IF -y2(n) = (un-qn*u(n-1)) / (qn*y2(n-1)+1.d0) -DO k = n-1,1,-1 -! This is the backsubstitution loop of the tridiagonal algorithm. - y2(k)=y2(k)*y2(k+1)+u(k) -END DO + else + stop '[rllsll] error in inversion' + end if -RETURN -END SUBROUTINE spline_real +! Reorient indices for later use + if ( use_sratrick==0 ) then + do icheb = 0,ncheb + do lm2 = 1,lmsize + do lm1 = 1,lmsize2 + yrf(lm1,lm2,icheb) = yrll(icheb,lm1,lm2) + zrf(lm1,lm2,icheb) = zrll(icheb,lm1,lm2) + end do + end do + end do + elseif ( use_sratrick==1 ) then -SUBROUTINE tmat_newsolver(ie,nspin,lmax,zat,socscale, & - ez,nsra,cleb,icleb,iend,ncheb,npan_tot, & - rpan_intervall,ipan_intervall, & - rnew,vinsnew,theta,phi,ipot, & - ! lly, & - lmpotd,irmd_new,TmatN,soc) ! new input parameters - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-18 Time: 14:58:02 - -#ifdef cpp_omp -!use omp_lib ! necessary for omp functions -#endif -#ifdef cpp_mpi -!use mpi -#endif -!use mod_mympi, only: myrank, nranks, master -#ifdef cpp_mpi -! & ,distribute_linear_on_tasks -#endif -!use mod_types, only: t_tgmat,t_inc,t_mpi_c_grid,init_tgmat, & -! t_lloyd,init_tlloyd - -!!use JijDij_mod, only: type_dtmatJijDij, init_t_dtmatJij_at, calc_dtmatJij + do icheb = 0,ncheb + do lm2 = 1,lmsize + do lm1 = 1,lmsize + yrf(lm1,lm2,icheb) = yrll1(icheb,lm1,lm2) + zrf(lm1,lm2,icheb) = zrll1(icheb,lm1,lm2) + yrf(lm1+lmsize,lm2,icheb) = yrll2(icheb,lm1,lm2) + zrf(lm1+lmsize,lm2,icheb) = zrll2(icheb,lm1,lm2) + end do + end do + end do -IMPLICIT NONE + end if -INTEGER, INTENT(IN) :: ie -!INTEGER, INTENT(IN) :: ielast -INTEGER, INTENT(IN) :: nspin -INTEGER, INTENT(IN) :: lmax -!DOUBLE PRECISION, INTENT(IN) :: rmesh(:) -DOUBLE PRECISION, INTENT(IN) :: zat -DOUBLE PRECISION, INTENT(IN) :: socscale -DOUBLE COMPLEX, INTENT(IN) :: ez(:) -INTEGER, INTENT(IN) :: nsra -DOUBLE PRECISION, INTENT(IN) :: cleb(:) -INTEGER, INTENT(IN) :: icleb(:,:) -INTEGER, INTENT(IN) :: iend -INTEGER, INTENT(IN) :: ncheb -INTEGER, INTENT(IN) :: npan_tot -DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(0:) -INTEGER, INTENT(IN) :: ipan_intervall(0:) -DOUBLE PRECISION, INTENT(IN) :: rnew(:) -DOUBLE PRECISION, INTENT(IN) :: vinsnew(:,:,:) -DOUBLE PRECISION, INTENT(IN) :: theta -DOUBLE PRECISION, INTENT(IN) :: phi -!INTEGER, INTENT(IN) :: i1 -INTEGER, INTENT(IN) :: ipot -!INTEGER, INTENT(IN) :: lly -!DOUBLE COMPLEX, INTENT(IN) :: deltae -INTEGER, INTENT(IN) :: lmpotd -!INTEGER, INTENT(IN) :: lmaxd -INTEGER, INTENT(IN) :: irmd_new -DOUBLE COMPLEX, INTENT(OUT) :: TmatN(:,:) -LOGICAL, INTENT(IN) :: soc -!INCLUDE 'inc.p' +! Calculation of eq. 5.19-5.22 + do icheb = 0,ncheb + zslc1sum(icheb) = slc1sum(icheb)*drpan2 + end do + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhlr(1,1,0), & + lmsize,yrf(1,1,0),lmsize2,czero,mrnvy,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjlr(1,1,0), & + lmsize,yrf(1,1,0),lmsize2,czero,mrjvy,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhlr(1,1,0), & + lmsize,zrf(1,1,0),lmsize2,czero,mrnvz,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjlr(1,1,0), & + lmsize,zrf(1,1,0),lmsize2,czero,mrjvz,lmsize) + do icheb = 1,ncheb + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhlr(1,1,icheb), & + lmsize,yrf(1,1,icheb),lmsize2,cone,mrnvy,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjlr(1,1,icheb), & + lmsize,yrf(1,1,icheb),lmsize2,cone,mrjvy,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhlr(1,1,icheb), & + lmsize,zrf(1,1,icheb),lmsize2,cone,mrnvz,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjlr(1,1,icheb), & + lmsize,zrf(1,1,icheb),lmsize2,cone,mrjvz,lmsize) + end do -INTEGER :: lmmaxd -INTEGER :: lmmaxso -INTEGER :: nrmaxd +end subroutine rll_local_solutions -DOUBLE COMPLEX eryd + SUBROUTINE sll_global_solutions(RPANBOUND,RMESH,VLL,SLL, & + NCHEB,NPAN,LMSIZE,LMSIZE2,LBESSEL,NRMAX, & + NVEC,JLK_INDEX,HLK,JLK,HLK2,JLK2,GMATPREFACTOR, & + USE_SRATRICK1,enable_quad_prec,new_sll) +! ************************************************************************ +! radial wave functions by the integral equation method of +! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) +! which has been extended for KKR using non-sperical potentials. +! Further information can be found in +! +! David Bauer, +! "Development of a relativistic full-potential first-principles multiple scattering +! Green function method applied to complex magnetic textures of nano structures +! at surfaces", PhD Thesis, 2014 +! +! http://darwin.bth.rwth-aachen.de/opus3/volltexte/2014/4925/ +! +! +! +! ************************************************************************ +! This routine solves the following equation: +! +! SLL(r) = H(r) - PRE * H(r) * int( dr' r'^2 H2(r') * op(V(r')) * RLL(r') ) +! + PRE * J(r) * int( dr' r'^2 H2(r') * op(V(r')) * SLL(r') ) +! +! ************************************************************************ +! Potential matrix : VLL(LMSIZE*NVEC,LMSIZE*NVEC) +! LMSIZE = LMMAX (number of LM components) x Number of spin components +! LMSIZE2 = NVEC* LMSIZE +! NVEC is 2 for a spinor and 1 in case of a non-rel. calculation +! +! ************************************************************************ +! Green function prefactor PRE=GMATPREFACTOR (scalar value) +! tipically \kappa for non-relativistic and M_0 \kappa for SRA +! +! ************************************************************************ -DOUBLE PRECISION, PARAMETER :: cvlight=274.0720442D0 -DOUBLE COMPLEX, PARAMETER :: czero=(0D0,0D0) -DOUBLE COMPLEX, PARAMETER :: cone=(1D0,0D0) +! ************************************************************************ +! The discretization of the Lippmann-Schwinger equation results in a matrix +! equation which is solved in this routine. Further information is given +! in section 5.2.3, page 90 of Bauer, PhD +! +! Source terms : +! right solution: J, H (nvec*lmsize,lmsize) or (lmsize,nvec*lmsize) +! left solution: J2,H2 (lmsize,nvec*lmsize) or (nvec*lmsize,lmsize) +! +! Example: +! The source term J is for LMSIZE=3 and NVEC=2 given by: +! J = / jlk(jlk_index(1)) \ +! | 0 jlk(jlk_index(2)) | +! | 0 0 jlk(jlk_index(3)) | +! | jlk(jlk_index(4)) | +! | 0 jlk(jlk_index(5)) | +! \ 0 0 jlk(jlk_index(6)) / +! +! first 3 rows are for the large and the last 3 rows for the small component +! ************************************************************************ +! Operator op() can be chosen to be a unity or a transpose operation +! The unity operation is used to calculate the right solution +! The transpose operation is used to calculate the left solution +! ************************************************************************ +! RMESH - radial mesh +! RPANBOUND - panel bounds RPANBOUND(0) left panel border of panel 1 +! RPANBOUND(1) right panel border of panel 1 +! NCHEB - highes chebyshev polynomial +! number of points per panel = NCHEB + 1 +! NPAN - number of panels +! LMSIZE - number of colums for the source matrix J etc... +! LMSIZE2 - number of rows for the source matrix J etc... +! NRMAX - total number of radial points (NPAN*(NCHEB+1)) +! NVEC - number of LMSIZE*LMSIZE blocks in J (LMSIZE2=NVEC*LMSIZE) +! ************************************************************************ +implicit none + integer :: ncheb ! number of chebyshev nodes + integer :: npan ! number of panels + integer :: lmsize ! lm-components * nspin + integer :: lmsize2 ! lmsize * nvec + integer :: nvec ! spinor integer + ! nvec=1 non-rel, nvec=2 for sra and dirac + integer :: nrmax ! total number of rad. mesh points + integer :: LBESSEL, use_sratrick1 ! dimensions etc., needed only for host code interface + integer :: iter_beta, niter_beta -DOUBLE COMPLEX, allocatable :: tmatll(:,:) -INTEGER :: ir,use_sratrick,nvec,lm1,irmdnew -DOUBLE COMPLEX gmatprefactor -DOUBLE PRECISION, allocatable :: vins(:,:,:) -DOUBLE COMPLEX, allocatable :: vnspll0(:,:,:),vnspll1(:,:,:,:), vnspll(:,:,:,:) -DOUBLE COMPLEX, allocatable :: hlk(:,:,:),jlk(:,:,:), hlk2(:,:,:),jlk2(:,:,:) -DOUBLE COMPLEX, allocatable :: rll(:,:,:,:) -!DOUBLE COMPLEX, allocatable :: rllleft(:,:,:,:),sllleft(:,:,:,:) ! neded for D_ij calculation -DOUBLE COMPLEX, allocatable :: tmatsph(:,:)! TMAT_OUT(:,:), tmat_out necessary for parallel ie loop -DOUBLE COMPLEX, allocatable :: dtmatll(:,:),tmat0(:,:) ! LLY -DOUBLE COMPLEX, allocatable :: alphall(:,:),dalphall(:,:),alpha0(:,:),aux(:,:) ! LLY -!DOUBLE COMPLEX, allocatable :: alphasph(:)!, DTMAT_OUT(:,:,:), ! LLY -INTEGER, allocatable :: jlk_index(:) -! LLoyd: -!INTEGER :: ideriv,signde ! LLY -!DOUBLE COMPLEX :: tralpha ! LLY -DOUBLE COMPLEX, allocatable :: ipiv(:) ! LLY -! .. OMP .. -INTEGER :: nth,ith ! total number of threads and thread id - -lmmaxd = (lmax+1)**2 -lmmaxso=2*lmmaxd -nrmaxd=irmd_new + double complex,parameter:: ci= (0.0d0,1.0d0), &! complex i + cone=(1.0d0,0.0d0),&! 1 + czero=(0.0d0,0.0d0) ! 0 + ! running indices + integer lm1,lm2 + integer icheb,ipan,mn + integer :: info, ipiv(lmsize) -allocate(tmatll(lmmaxso,lmmaxso)) -allocate(dtmatll(lmmaxso,lmmaxso)) -allocate(tmat0(lmmaxso,lmmaxso)) -allocate(alphall(lmmaxso,lmmaxso)) -allocate(dalphall(lmmaxso,lmmaxso)) -allocate(alpha0(lmmaxso,lmmaxso)) -allocate(aux(lmmaxso,lmmaxso)) -allocate(jlk_index(2*lmmaxso)) -allocate(ipiv(lmmaxso)) -! .. OMP .. -! determine if omp parallelisation is used (compiled with -openmp flag and -! OMP_NUM_THREADS>1) -!$noomp parallel shared(nth,ith) -!$noomp single -nth = 1 -ith = 0 -!nth = omp_get_num_threads() -!$noomp end single -!$noomp end parallel -! write(*,*) 'nth =',nth + ! source terms + double complex :: gmatprefactor ! prefactor of green function + ! non-rel: = kappa = sqrt e + DOUBLE COMPLEX :: HLK(LBESSEL,NRMAX), & + JLK(LBESSEL,NRMAX), & + HLK2(LBESSEL,NRMAX), & + JLK2(LBESSEL,NRMAX) + INTEGER JLK_INDEX(2*LMSIZE) -irmdnew= npan_tot*(ncheb+1) -allocate(vins(irmdnew,lmpotd,nspin)) -vins=0D0 -DO lm1=1,lmpotd - DO ir=1,irmdnew - vins(ir,lm1,1)=vinsnew(ir,lm1,ipot) - vins(ir,lm1,nspin)=vinsnew(ir,lm1,ipot+nspin-1) - END DO -END DO -!c set up the non-spherical ll' matrix for potential VLL' - IF (NSRA.EQ.2) THEN -USE_SRATRICK=1 -ELSEIF (NSRA.EQ.1) THEN -USE_SRATRICK=0 -ENDIF -allocate(vnspll0(lmmaxso,lmmaxso,irmdnew)) -allocate(vnspll1(lmmaxso,lmmaxso,irmdnew,0:nth-1)) -vnspll0=czero -CALL vllmat(1,irmdnew,lmmaxd,lmmaxso,vnspll0,vins, & - cleb,icleb,iend,nspin,zat,rnew,use_sratrick) + double complex :: sll(lmsize2,lmsize,nrmax), & ! irr. volterra sol. + vll(lmsize*nvec,lmsize*nvec,nrmax) ! potential term in 5.7, bauer, phd -! initial allocate -IF (nsra == 2) THEN - allocate(vnspll(2*lmmaxso,2*lmmaxso,irmdnew,0:nth-1)) -ELSE - allocate(vnspll(lmmaxso,lmmaxso,irmdnew,0:nth-1)) -END IF + double complex,allocatable :: & + work(:,:), & + cllp(:,:,:),dllp(:,:,:), & + cllptemp(:,:),dllptemp(:,:), & + mihvy(:,:,:),mihvz(:,:,:), & + mijvy(:,:,:),mijvz(:,:,:) + double complex,allocatable :: yif(:,:,:,:), zif(:,:,:,:) + double complex,allocatable :: betainv(:,:),betainv_save(:,:) + + complex*32, allocatable :: qcllp(:, :, :), qdllp(:, :, :) + complex*32, allocatable :: qmihvy(:, :), qmihvz(:, :), qmijvy(:, :), qmijvz(:, :) + complex*32, allocatable :: qyif(:, :, :) + complex*32, allocatable :: qcllptemp(:, :), qdllptemp(:, :) + complex*32, allocatable :: qsll(:, :) + complex*32, allocatable :: qcone, qczero + complex*32, allocatable :: qbetainv(:, :), qbetainv_save(:, :) -allocate(hlk(1:4*(lmax+1),irmdnew,0:nth-1)) -allocate(jlk(1:4*(lmax+1),irmdnew,0:nth-1)) -allocate(hlk2(1:4*(lmax+1),irmdnew,0:nth-1)) -allocate(jlk2(1:4*(lmax+1),irmdnew,0:nth-1)) -allocate(tmatsph(2*(lmax+1),0:nth-1)) -allocate(rll(nsra*lmmaxso,lmmaxso,irmdnew,0:nth-1)) -!allocate(rllleft(nsra*lmmaxso,lmmaxso,irmdnew,0:nth-1)) -!allocate(sllleft(nsra*lmmaxso,lmmaxso,irmdnew,0:nth-1)) -!allocate(tmat_out(lmmaxso,lmmaxso)) + ! chebyshev arrays + double precision c1(0:ncheb,0:ncheb),rpanbound(0:npan) + double precision cslc1(0:ncheb,0:ncheb), & ! Integration matrix from left ( C*S_L*C^-1 in eq. 5.53) + csrc1(0:ncheb,0:ncheb), & ! Same from right ( C*S_R*C^-1 in eq. 5.54) + tau(0:ncheb,0:npan), & ! Radial mesh point + slc1sum(0:ncheb),rmesh(nrmax),drpan2 -! energy loop -!WRITE(6,*) 'atom: ',i1,' NSRA:',nsra - -!!$noomp parallel do default(none) -!!$noomp& private(eryd,ie,i1,ir,irec,nvec,lm1,lm2,gmatprefactor) -!!$noomp& private(jlk_index,tmatll,ith) -!!$noomp& shared(nspin,nsra,lmax,iend,ipot,ielast,npan_tot,ncheb) -!!$noomp& shared(zat,socscale,ez,rmesh,cleb,rnew,nth) -!!$noomp& shared(rpan_intervall,vinsnew,ipan_intervall) -!!$noomp& shared(use_sratrick,irmdnew,theta,phi,vins,vnspll0) -!!$noomp& shared(vnspll1,vnspll,hlk,jlk,hlk2,jlk2,rll,tmat_out) -!!$noomp& shared(tmatsph) -!DO ie=1,ielast -! get current thread -! IF (nth>=1) THEN -! ith = omp_get_thread_num() -! ELSE - ith = 0 -! END IF - eryd = ez(ie) -!!$noomp critical -! WRITE(6,*) 'energy:',ie,'',eryd -!write(*,*) 'nested omp?',omp_get_nested() -!!$noomp end critical - -! contruct the spin-orbit coupling hamiltonian and add to potential - CALL spinorbit_ham(lmax,lmmaxd,vins,rnew, & - eryd,zat,cvlight,socscale,nspin,lmpotd, & - theta,phi,ipan_intervall,rpan_intervall, npan_tot,ncheb,irmdnew,nrmaxd, & - vnspll0(:,:,:),vnspll1(:,:,:,ith),'1',soc) -!c extend matrix for the SRA treatment - vnspll(:,:,:,ith)=czero - IF (nsra == 2) THEN - IF (use_sratrick == 0) THEN - CALL vllmatsra(vnspll1(:,:,:,ith),vnspll(:,:,:,ith),rnew, & - lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=0') - ELSE IF (use_sratrick == 1) THEN - CALL vllmatsra(vnspll1(:,:,:,ith),vnspll(:,:,:,ith),rnew, & - lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=Vsph') - END IF - ELSE - vnspll(:,:,:,ith)=vnspll1(:,:,:,ith) - END IF - -!c calculate the source terms in the Lippmann-Schwinger equation -!c these are spherical hankel and bessel functions - hlk(:,:,ith)=czero - jlk(:,:,ith)=czero - hlk2(:,:,ith)=czero - jlk2(:,:,ith)=czero - gmatprefactor=czero - CALL rllsllsourceterms(nsra,nvec,eryd,rnew,irmdnew,nrmaxd,lmax, & - lmmaxso,1,jlk_index,hlk(:,:,ith), & - jlk(:,:,ith),hlk2(:,:,ith),jlk2(:,:,ith), gmatprefactor) -!c using spherical potential as reference - IF (use_sratrick == 1) THEN - CALL calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,zat,cvlight,eryd, & - rnew,vins,ncheb,npan_tot,rpan_intervall, & - jlk_index,hlk(:,:,ith),jlk(:,:,ith),hlk2(:,:,ith), & - jlk2(:,:,ith),gmatprefactor,tmatsph(:,ith), use_sratrick) - END IF - -!c calculate the tmat and wavefunctions - rll(:,:,:,ith)=czero - -!c right solutions - tmatll=czero - CALL rll_only(rpan_intervall,rnew,vnspll(:,:,:,ith), & - rll(:,:,:,ith),tmatll(:,:),ncheb, & - npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1),irmdnew, & - nsra,jlk_index,hlk(:,:,ith),jlk(:,:,ith), & - hlk2(:,:,ith),jlk2(:,:,ith),gmatprefactor, '1','1',use_sratrick) -! & ,ith) ! test fivos -! IF (nsra == 2) THEN -! RLL(LMMAXSO+1:NVEC*LMMAXSO,:,:,ith)= -! + RLL(LMMAXSO+1:NVEC*LMMAXSO,:,:,ith)/C -! END IF -!if(t_dtmatjij_at%calculate) then + double precision dllpmax,dllpval + logical :: enable_quad_prec, new_sll + integer :: use_sratrick + external zgetrf,zgetrs,zgemm,zgetri + intrinsic abs,atan,cos,dimag,exp,max,min,sin,sqrt - - !for Jij-tensor calculation: allocate array to hold additional t-matrices -! call init_t_dtmatJij_at(t_dtmatJij_at) -! -! -!! lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll -!! lllllllllll calculate the left-hand side solution lllllllllllllllllllllllllllllllllllll -!! contruct the spin-orbit coupling hamiltonian and add to potential -! call spinorbit_ham(lmax,lmmaxd,vins,rnew, & -! eryd,zat,cvlight,socscale,nsra,nspin,lmpotd, & -! theta,phi,ipan_intervall,rpan_intervall, & -! npan_tot,ncheb,irmdnew,nrmaxd, & -! vnspll0(:,:,:),vnspll1(:,:,:,ith), & -! 'transpose',soc) -! -!! extend matrix for the sra treatment -! vnspll(:,:,:,ith)=czero -! if (nsra.eq.2) then -! if (use_sratrick.eq.0) then -! call vllmatsra(vnspll1(:,:,:,ith),vnspll(:,:,:,ith),rnew, & -! lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'ref=0') -! elseif (use_sratrick.eq.1) then -! call vllmatsra(vnspll1(:,:,:,ith),vnspll(:,:,:,ith),rnew, & -! lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'ref=vsph') -! endif -! else -! vnspll(:,:,:,ith)=vnspll1(:,:,:,ith) -! endif -! -!! calculate the source terms in the lippmann-schwinger equation -!! these are spherical hankel and bessel functions -! hlk(:,:,ith)=czero -! jlk(:,:,ith)=czero -! hlk2(:,:,ith)=czero -! jlk2(:,:,ith)=czero -! gmatprefactor=czero -! jlk_index = 0 -! call rllsllsourceterms(nsra,nvec,eryd,rnew,irmdnew,nrmaxd,lmax, & -! lmmaxso,1,jlk_index,hlk(:,:,ith), & -! jlk(:,:,ith),hlk2(:,:,ith),jlk2(:,:,ith), & -! gmatprefactor) -! -!! using spherical potential as reference -!! notice that exchange the order of left and right hankel/bessel functions -! if (use_sratrick.eq.1) then -! tmatsph(:,ith)=czero -! call calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,zat,cvlight,eryd, & -! lmpotd,lmmaxso,rnew,vins,ncheb,npan_tot,rpan_intervall, & -! jlk_index,hlk2(:,:,ith),jlk2(:,:,ith),hlk(:,:,ith), & -! jlk(:,:,ith),gmatprefactor,tmatsph(:,ith), & -! use_sratrick) -! endif -! -!! calculate the tmat and wavefunctions -! rllleft(:,:,:,ith)=czero -! sllleft(:,:,:,ith)=czero -! -!! left solutions -!! notice that exchange the order of left and right hankel/bessel functions -! tmat0=czero -! alpha0=czero ! lly -! call rllsll(rpan_intervall,rnew,vnspll(:,:,:,ith), & -! rllleft(:,:,:,ith),sllleft(:,:,:,ith),tmat0,ncheb, & -! npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1),irmdnew, & -! nrmaxd,nsra,jlk_index,hlk2(:,:,ith),jlk2(:,:,ith), & -! hlk(:,:,ith),jlk(:,:,ith),gmatprefactor, & -! '1','1','0',use_sratrick) -! if (nsra.eq.2) then -! rllleft(lmmaxso+1:nvec*lmmaxso,:,:,ith)= & -! rllleft(lmmaxso+1:nvec*lmmaxso,:,:,ith)/cvlight -! sllleft(lmmaxso+1:nvec*lmmaxso,:,:,ith)= & -! sllleft(lmmaxso+1:nvec*lmmaxso,:,:,ith)/cvlight -! endif -!! lllllllllll calculate the left-hand side solution lllllllllllllllllllllllllllllllllllll -!! lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll +! *********************************************************************** +! SRA trick +! *********************************************************************** +! on page 68 of Bauer, PhD, a method is described how to speed up the +! calculations in case of the SRA. A similar approach is implemented +! here by using Eq. 4.132 and substituting DV from 4.133, and discretising +! the radial mesh of the Lippmann-Schwinger eq. according to 5.68. +! The Lippmann-Schwinger equation leads to a matrix inversion +! problem. The matrix M which needs to be inverted has a special form +! if the SRA approximation is used: +! +! matrix A ( C 0) (same as in eq. 5.68) +! ( B 1) +! (C, B are matricies here) ! -! call calc_dtmatjij(lmaxd,lmmaxd,lmmaxso,lmpotd,ntotd,nrmaxd, & -! nsra,irmdnew,nspin,vins,rllleft(:,:,:,ith),rll(:,:,:,ith), & -! rpan_intervall, & -! ipan_intervall,npan_tot,ncheb,cleb,icleb,iend,ncleb,rnew, & -! theta,phi,t_dtmatjij_at%dtmat_xyz(:,:,:,ie_num)) +! inverse of A is (C^-1 0 ) +! (-B C^-1 1 ) +! Thus, it is sufficient to only inverse the matrix C which saves computational +! time. This is refered to as the SRA trick. +! *********************************************************************** +! in future implementation equation 4.134 is supposed to be +! implemented which should lead to an additional speed-up. +! *********************************************************************** -! end if!t_dtmatjij_at%calculate - - -! add spherical contribution of tmatrix - IF (use_sratrick == 1) THEN - DO lm1=1,lmmaxso - tmatll(lm1,lm1)=tmatll(lm1,lm1)+tmatsph(jlk_index(lm1),ith) - END DO - END IF - TmatN(:,:) = tmatll(:,:) -!END DO ! IE loop -!!$noomp end parallel do - -! serial write out after parallel calculation of tmat -!DO ie=1,ielast -! irec = ie + ielast*(i1-1) -! WRITE(69,REC=irec) tmat_out(:,:,ie) -! write(696969,*) TMAT_out(:,:,ie) -!END DO + niter_beta = 3 + if(.not.enable_quad_prec) niter_beta = 2 -deallocate(vins) -deallocate(vnspll0) -deallocate(vnspll1) -deallocate(vnspll) -deallocate(hlk) -deallocate(jlk) -deallocate(hlk2) -deallocate(jlk2) -deallocate(tmatsph) -deallocate(rll) +if ( lmsize==1 ) then + use_sratrick=0 +else + use_sratrick=use_sratrick1 +end if -END SUBROUTINE tmat_newsolver +if(.not.allocated(work)) allocate( work(lmsize,lmsize) ) +if(.not.allocated(betainv)) allocate( betainv(lmsize,lmsize) ) +if(.not.allocated(betainv_save)) allocate( betainv_save(lmsize,lmsize) ) +if(.not.allocated(cllp)) allocate( cllp(lmsize,lmsize,0:npan) ) +if(.not.allocated(dllp)) allocate( dllp(lmsize,lmsize,0:npan) ) +if(.not.allocated(cllptemp)) allocate( cllptemp(lmsize,lmsize) ) +if(.not.allocated(dllptemp)) allocate( dllptemp(lmsize,lmsize) ) +if(.not.allocated(mihvy)) allocate( mihvy(lmsize,lmsize,npan) ) +if(.not.allocated(mihvz)) allocate( mihvz(lmsize,lmsize,npan) ) +if(.not.allocated(mijvy)) allocate( mijvy(lmsize,lmsize,npan) ) +if(.not.allocated(mijvz)) allocate( mijvz(lmsize,lmsize,npan) ) +if(.not.allocated(betainv)) allocate (betainv(lmsize,lmsize)) +if(.not.allocated(betainv_save)) allocate (betainv_save(lmsize,lmsize)) -! ************************************************************************ - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-18 Time: 14:28:39 +if(.not.allocated(yif)) allocate( yif(lmsize2,lmsize,0:ncheb,npan) ) +if(.not.allocated(zif)) allocate( zif(lmsize2,lmsize,0:ncheb,npan) ) -SUBROUTINE vllmat(irmin,irc,lmmax,lmmaxso,vnspll0,vins, & - cleb,icleb,iend,nspin,z,rnew,use_sratrick) -! ************************************************************************ -! .. Parameters .. -IMPLICIT NONE +do ipan = 1,npan + do icheb = 0,ncheb + mn = ipan*ncheb + ipan - icheb + tau(icheb,ipan) = rmesh(mn) + end do +end do -INTEGER, INTENT(IN) :: irmin -!INTEGER, INTENT(IN) :: nrmaxd -INTEGER, INTENT(IN) :: irc -INTEGER, INTENT(IN) :: lmmax -INTEGER, INTENT(IN) :: lmmaxso -DOUBLE COMPLEX, INTENT(OUT) :: vnspll0(:,:,irmin:) -DOUBLE PRECISION, INTENT(IN OUT) :: vins(irmin:,:,:) -DOUBLE PRECISION, INTENT(IN) :: cleb(:) -INTEGER, INTENT(IN) :: icleb(:,:) -INTEGER, INTENT(IN) :: iend -INTEGER, INTENT(IN) :: nspin -DOUBLE PRECISION, INTENT(IN) :: z -DOUBLE PRECISION, INTENT(IN) :: rnew(irmin:) -INTEGER, INTENT(IN OUT) :: use_sratrick -!INCLUDE 'inc.p' -!INTEGER :: lmpotd -!DOUBLE PRECISION, INTENT, PARAMETER :: lmpotd= (lpotd+1)**2 -! .. -! .. Scalar Arguments .. +call chebint(cslc1,csrc1,slc1sum,c1,ncheb) -INTEGER :: isp -! .. -! .. Array Arguments .. -DOUBLE PRECISION, allocatable :: vnspll(:,:,:,:) + do ipan = 1, npan -! .. -! .. Local Scalars .. -INTEGER :: i,ir,j,lm1,lm2,lm3 -! .. + drpan2 = (rpanbound(ipan)-rpanbound(ipan-1))/2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 + call sll_local_solutions(vll,tau(0,ipan),drpan2,csrc1, slc1sum, & + mihvy(1,1,ipan),mihvz(1,1,ipan),mijvy(1,1,ipan),mijvz(1,1,ipan), & + yif(1,1,0,ipan),zif(1,1,0,ipan),ncheb,ipan,lmsize,lmsize2,nrmax,nvec, & + jlk_index,hlk,jlk,hlk2,jlk2,gmatprefactor,lbessel,use_sratrick1) -allocate(vnspll(lmmax,lmmax,irmin:irc,2)) + end do ! ipan -DO isp=1,nspin - DO lm1 = 1,lmmax - DO lm2 = 1,lm1 - DO ir = irmin,irc - vnspll(lm1,lm2,ir,isp) = 0.0D0 - END DO - END DO - END DO - - DO j = 1,iend - lm1 = icleb(j,1) - lm2 = icleb(j,2) - lm3 = icleb(j,3) - DO i = irmin,irc - vnspll(lm1,lm2,i,isp) = vnspll(lm1,lm2,i,isp) + cleb(j)*vins(i,lm3,isp) - END DO - END DO - -!---> use symmetry of the gaunt coef. - - DO lm1 = 1,lmmax - DO lm2 = 1,lm1 - 1 - DO i = irmin,irc - vnspll(lm2,lm1,i,isp) = vnspll(lm1,lm2,i,isp) - END DO - END DO - END DO - - IF (use_sratrick == 0) THEN - DO lm1=1,lmmax - DO i=irmin,irc - vnspll(lm1,lm1,i,isp)=vnspll(lm1,lm1,i,isp)+ & - vins(i,1,isp)-2D0*z/rnew(i) - END DO - END DO - END IF - -END DO !NSPIN +! *********************************************************************** +! calculate C(M), D(M) +! (starting condition: C(NPAN) = 0 and D(NPAN) = 1) +! *********************************************************************** -! set vnspll as twice as large +dllp(:,:,npan) = czero +cllp(:,:,npan) = czero +do lm1 = 1,lmsize + dllp(lm1,lm1,npan) = cone +end do -vnspll0(1:lmmax,1:lmmax,irmin:irc)= vnspll(1:lmmax,1:lmmax,irmin:irc,1) +do ipan = npan,1,-1 -vnspll0(lmmax+1:lmmaxso,lmmax+1:lmmaxso,irmin:irc)= & - vnspll(1:lmmax,1:lmmax,irmin:irc,nspin) -END SUBROUTINE vllmat + cllp(:,:,ipan-1) = cllp(:,:,ipan) + dllp(:,:,ipan-1) = dllp(:,:,ipan) + call zgemm('n','n',lmsize,lmsize,lmsize, cone,mihvz(1,1,ipan), & + lmsize,cllp(1,1,ipan),lmsize,cone,cllp(1,1,ipan-1),lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize, cone,mihvy(1,1,ipan), & + lmsize,dllp(1,1,ipan),lmsize,cone,cllp(1,1,ipan-1),lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mijvz(1,1,ipan), & + lmsize,cllp(1,1,ipan),lmsize,cone,dllp(1,1,ipan-1),lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mijvy(1,1,ipan), & + lmsize,dllp(1,1,ipan),lmsize,cone,dllp(1,1,ipan-1),lmsize) +end do -SUBROUTINE spinorbit_ham(lmax,lmmaxd,vins,rnew,e,z,c,socscale, & - nspin,lmpotd,theta,phi, & - ipan_intervall,rpan_intervall, & - npan_tot,ncheb,irmdnew,nrmaxd,vnspll,vnspll1, & - mode,soc) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-18 Time: 14:28:35 +! *********************************************************************** +! determine the irregular solution sll by using 5.14 +! *********************************************************************** -IMPLICIT NONE +if(.not.new_sll) then +do ipan = 1,npan + do icheb = 0,ncheb + mn = ipan*ncheb + ipan - icheb + call zgemm('n','n',lmsize2,lmsize,lmsize,cone,zif(1,1,icheb,ipan), & + lmsize2,cllp(1,1,ipan),lmsize,czero,sll(1,1,mn),lmsize2) + call zgemm('n','n',lmsize2,lmsize,lmsize,cone,yif(1,1,icheb,ipan), & + lmsize2,dllp(1,1,ipan),lmsize,cone,sll(1,1,mn),lmsize2) + end do +end do +else -INTEGER, INTENT(IN) :: lmax -INTEGER, INTENT(IN) :: lmmaxd -DOUBLE PRECISION, INTENT(IN) :: vins(irmdnew,lmpotd,nspin) -DOUBLE PRECISION, INTENT(IN) :: rnew(nrmaxd) -DOUBLE COMPLEX, INTENT(IN OUT) :: e -DOUBLE PRECISION, INTENT(IN) :: z -DOUBLE PRECISION, INTENT(IN) :: c -DOUBLE PRECISION, INTENT(IN) :: socscale -!INTEGER, INTENT(IN) :: nsra -INTEGER, INTENT(IN) :: nspin -INTEGER, INTENT(IN) :: lmpotd -DOUBLE PRECISION, INTENT(IN) :: theta -DOUBLE PRECISION, INTENT(IN) :: phi -INTEGER, INTENT(IN) :: ipan_intervall(0:) -DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(0:) -INTEGER, INTENT(IN) :: npan_tot -INTEGER, INTENT(IN) :: ncheb -INTEGER, INTENT(IN) :: irmdnew -INTEGER, INTENT(IN OUT) :: nrmaxd -DOUBLE COMPLEX, INTENT(IN) :: vnspll(:,:,:) -DOUBLE COMPLEX, INTENT(OUT) :: vnspll1(:,:,:) -CHARACTER(LEN=*), INTENT(IN) :: mode -LOGICAL, INTENT(IN) :: soc !switches SOC on and off +if(.not.allocated(cllptemp)) allocate( cllptemp(lmsize,lmsize) ) +if(.not.allocated(dllptemp)) allocate( dllptemp(lmsize,lmsize) ) + + betainv = dllp(:, :, 0) + + call zgetrf(lmsize, lmsize, betainv, lmsize, ipiv, info) ! invert beta + call zgetri(lmsize, betainv, lmsize, ipiv, work, lmsize*lmsize, info) + +if(enable_quad_prec) then +if(.not.allocated(qcone)) allocate (qcone) +if(.not.allocated(qczero)) allocate (qczero) +if(.not.allocated(qmihvy)) allocate (qmihvy(lmsize,lmsize)) +if(.not.allocated(qmihvz)) allocate (qmihvz(lmsize,lmsize)) +if(.not.allocated(qmijvy)) allocate (qmijvy(lmsize,lmsize)) +if(.not.allocated(qmijvz)) allocate (qmijvz(lmsize,lmsize)) +if(.not.allocated(qyif)) allocate (qyif(lmsize2,lmsize,0:ncheb)) +if(.not.allocated(qbetainv)) allocate (qbetainv(lmsize,lmsize)) +if(.not.allocated(qbetainv_save)) allocate (qbetainv_save(lmsize,lmsize)) +if(.not.allocated(qsll)) allocate (qsll(lmsize2,lmsize)) +if(.not.allocated(qcllp)) allocate (qcllp(lmsize,lmsize,0:npan)) +if(.not.allocated(qdllp)) allocate (qdllp(lmsize,lmsize,0:npan)) +if(.not.allocated(qcllptemp)) allocate (qcllptemp(lmsize,lmsize)) +if(.not.allocated(qdllptemp)) allocate (qdllptemp(lmsize,lmsize)) + qcone = (1.q0,0.0q0) + qczero = (0.q0,0.0q0) + qbetainv = betainv +end if + do iter_beta = 1, niter_beta + if(.not.enable_quad_prec) then + dllp(:, :, npan) = betainv + cllp(:, :, npan) = czero + do lm2 = 1, lmsize + dllp(lm2, lm2, npan) = betainv(lm2,lm2) - cone + end do -DOUBLE PRECISION :: vr(irmdnew),dvdr(irmdnew) -DOUBLE PRECISION :: rmass(irmdnew),hsofac(irmdnew) -DOUBLE PRECISION :: rnucl,atn,widthfac -INTEGER :: ir,ip,lm1,lm2,ispin,irmin,irmax,ncoll -DOUBLE COMPLEX lsmh(2*lmmaxd,2*lmmaxd),temp -DOUBLE PRECISION :: clambdacinv(0:ncheb,0:ncheb) -!DOUBLE PRECISION :: matvec_dmdm -LOGICAL :: test,opt -EXTERNAL test,opt + do ipan = npan, 1, -1 -vnspll1=(0D0,0D0) -vr=0D0 -DO ispin=1,nspin - DO ir=1,ipan_intervall(npan_tot) - vr(ir)=vr(ir)+vins(ir,1,ispin)/nspin - END DO -END DO -! derivative of potential -dvdr=0D0 -CALL getclambdacinv(ncheb,clambdacinv) -DO ip=1,npan_tot - irmin=ipan_intervall(ip-1)+1 - irmax=ipan_intervall(ip) - widthfac= 2D0/(rpan_intervall(ip)-rpan_intervall(ip-1)) - CALL dgemv('N',ncheb+1,ncheb+1,1D0,clambdacinv,ncheb+1, & - vr(irmin:irmax),1,0D0,dvdr(irmin:irmax),1) - dvdr(irmin:irmax)= dvdr(irmin:irmax)*widthfac -END DO -! core potential -IF (z > 24D0) THEN - atn=-16.1532921+2.70335346*z -ELSE - atn=0.03467714+2.04820786*z -END IF -rnucl=1.2D0/0.529177D0*atn**(1./3D0)*1.d-5 + cllp(:, :, ipan-1) = cllp(:, :, ipan) + mihvy(:, :, ipan) + dllp(:, :, ipan-1) = dllp(:, :, ipan) - mijvy(:, :, ipan) -DO ir=1,ipan_intervall(npan_tot) - IF (rnew(ir) <= rnucl) THEN -! DVDR(IR)=DVDR(IR)+2d0*Z*RNEW(IR)/RNUCL**3d0 - ELSE -! DVDR(IR)=DVDR(IR)+2d0*Z/RNEW(IR)**2d0 - END IF - dvdr(ir)=dvdr(ir)+2D0*z/rnew(ir)**2D0 -END DO -! contruct LS matrix + call zgemm('n', 'n', lmsize, lmsize, lmsize, cone, mihvz(1,1,ipan), lmsize, cllp(1,1,ipan), lmsize, cone, cllp(1,1,ipan-1), lmsize) + call zgemm('n', 'n', lmsize, lmsize, lmsize, cone, mihvy(1,1,ipan), lmsize, dllp(1,1,ipan), lmsize, cone, cllp(1,1,ipan-1), lmsize) + call zgemm('n', 'n', lmsize, lmsize, lmsize, -cone, mijvz(1,1,ipan), lmsize, cllp(1,1,ipan), lmsize, cone, dllp(1,1,ipan-1), lmsize) + call zgemm('n', 'n', lmsize, lmsize, lmsize, -cone, mijvy(1,1,ipan), lmsize, dllp(1,1,ipan), lmsize, cone, dllp(1,1,ipan-1), lmsize) -CALL spin_orbit_compl(lmax,lmmaxd,lsmh) + end do -! roate LS matrix -ncoll=1 -IF (ncoll == 1) THEN - CALL rotatematrix(lsmh,theta,phi,lmmaxd,1) -END IF + betainv_save = betainv -IF (mode == 'transpose') THEN - DO lm1=1,2*lmmaxd - DO lm2=1,lm1-1 - temp=lsmh(lm2,lm1) - lsmh(lm2,lm1)=lsmh(lm1,lm2) - lsmh(lm1,lm2)=temp - END DO - END DO -ELSE IF (mode == '1') THEN -END IF -! contruct prefactor of spin-orbit hamiltonian + call zgemm('n', 'n', lmsize, lmsize, lmsize, -cone, betainv_save, lmsize, dllp(1,1,0), lmsize, cone, betainv, lmsize) -hsofac=0D0 -DO ir=1,irmdnew - rmass(ir)=0.5D0-0.5D0/c**2*((vr(ir)-REAL(e))-2D0*z/rnew(ir)) - IF (soc .eqv. .false. .OR. z < 1D-6) THEN - hsofac(ir)=0D0 - ELSE - hsofac(ir)=socscale/(2D0*rmass(ir)**2*c**2*rnew(ir))*dvdr(ir) - END IF - -! add to potential - - DO lm1=1,2*lmmaxd - DO lm2=1,2*lmmaxd - vnspll1(lm1,lm2,ir)=vnspll(lm1,lm2,ir)+hsofac(ir)*lsmh(lm1,lm2) - END DO - END DO -END DO -END SUBROUTINE spinorbit_ham +! dllpmax = 0.d0 +! do lm1 = 1,lmsize +! do lm2 = 1,lmsize +! dllpval = dllp(lm1,lm2,0) +! if(lm1.ne.lm2.and.abs(dllpval).gt.dllpmax) dllpmax = abs(dllpval) +! if(lm1.eq.lm2.and.abs(dllpval-cone).gt.dllpmax) dllpmax = abs(dllpval-cone) +! end do +! end do + else -subroutine vllmatsra(vll0,vll,rmesh,lmsize,nrmax,nrmaxd,eryd,cvlight,lmax,lval_in,cmode) -!************************************************************************************ -! The perubation matrix for the SRA-equations are set up -!************************************************************************************ -implicit none -!interface - DOUBLE COMPLEX VLL(2*lmsize,2*lmsize,nrmax) - DOUBLE COMPLEX VLL0(lmsize,lmsize,nrmax) - double precision :: rmesh(nrmaxd) - double complex :: eryd - double precision :: cvlight - integer :: lmax,lval_in - integer :: lmsize,nrmax,nrmaxd - character(len=*) :: cmode -!local - integer :: ilm,lval,mval,ival,ir - integer :: loflm(lmsize) - double complex :: Mass,Mass0 - double complex,parameter :: cone=(1.0D0,0.0D0) - double complex,parameter :: czero=(0.0D0,0.0D0) + qdllp(:, :, npan) = qbetainv + qcllp(:, :, npan) = qczero + do lm2 = 1, lmsize + qdllp(lm2, lm2, npan) = qbetainv(lm2,lm2) - qcone + end do -!************************************************************************************ -! determine the bounds of the matricies to get the lm-expansion and the max. number -! of radial points -!************************************************************************************ + do ipan = npan, 1, -1 + qmihvz(:, :) = mihvz(:, :, ipan) + qmihvy(:, :) = mihvy(:, :, ipan) + qmijvz(:, :) = mijvz(:, :, ipan) + qmijvy(:, :) = mijvy(:, :, ipan) + qcllp(:, :, ipan-1) = qcllp(:, :, ipan) + qmihvy(:, :) + qdllp(:, :, ipan-1) = qdllp(:, :, ipan) - qmijvy(:, :) -!************************************************************************************ -! calculate the index array to determine the L value of an LM index -! in case of spin-orbit coupling 2*(LMAX+1)**2 are used instead of (LMAX+1)**2 -! the second half refers to the second spin and has the the same L value -!************************************************************************************ -ilm=0 + call cqgemm(lmsize,lmsize,lmsize,qcone,qmihvz,lmsize,qcllp(1,1,ipan),lmsize,qcone,qcllp(1,1,ipan-1),lmsize) + call cqgemm(lmsize,lmsize,lmsize,qcone,qmihvy,lmsize,qdllp(1,1,ipan),lmsize,qcone,qcllp(1,1,ipan-1),lmsize) + call cqgemm(lmsize,lmsize,lmsize,-qcone,qmijvz,lmsize,qcllp(1,1,ipan),lmsize,qcone,qdllp(1,1,ipan-1),lmsize) + call cqgemm(lmsize,lmsize,lmsize,-qcone,qmijvy,lmsize,qdllp(1,1,ipan),lmsize,qcone,qdllp(1,1,ipan-1),lmsize) -if (lmsize==1) then - loflm(1)=lval_in -elseif ((lmax+1)**2 == lmsize) then - do lval=0,lmax - do mval = -lval,lval - ilm=ilm+1 - loflm(ilm)=lval end do - end do -elseif (2* (lmax+1)**2 ==lmsize ) then - do ival=1,2 - do lval=0,lmax - do mval = -lval,lval - ilm=ilm+1 - loflm(ilm)=lval + + qbetainv_save = qbetainv + + call cqgemm(lmsize, lmsize, lmsize, -qcone, qbetainv_save, lmsize, qdllp(1,1,0), lmsize, qcone, qbetainv, lmsize) +! dllpmax = 0.0d0 +! do lm1 = 1,lmsize +! do lm2 = 1,lmsize +! dllpval = qdllp(lm1,lm2,0) +! if(abs(dllpval).gt.dllpmax) dllpmax = abs(dllpval) +! end do +! end do + end if + +! write(6,*) 'dllpmax',dllpmax,'iter_beta',iter_beta + + end do ! niter_beta + + if(.not.enable_quad_prec) then + + do ipan = 0, npan + do lm1 = 1, lmsize + dllp(lm1,lm1,ipan) = dllp(lm1,lm1,ipan) + cone + end do + end do + + do ipan = 1, npan + cllptemp(:, :) = cllp(:, :, ipan) + dllptemp(:, :) = dllp(:, :, ipan) + cllp(:, :,ipan) = cllptemp(:, :)*(cone+cone) + dllp(:, :,ipan) = dllptemp(:, :)*(cone+cone) + call zgemm('n', 'n', lmsize, lmsize, lmsize, -cone, cllptemp, lmsize, dllp(1,1,0), lmsize, cone, cllp(1,1,ipan), lmsize) + call zgemm('n', 'n', lmsize, lmsize, lmsize, -cone, dllptemp, lmsize, dllp(1,1,0), lmsize, cone, dllp(1,1,ipan), lmsize) + end do + + do ipan = 1, npan + do icheb = 0, ncheb + mn = ipan*ncheb + ipan - icheb + call zgemm('n', 'n', lmsize2, lmsize, lmsize, cone, zif(1,1,icheb,ipan), lmsize2, cllp(1,1,ipan), lmsize, czero, sll(1,1,mn), lmsize2) + call zgemm('n', 'n', lmsize2, lmsize, lmsize, cone, yif(1,1,icheb,ipan), lmsize2, dllp(1,1,ipan), lmsize, cone, sll(1,1,mn), lmsize2) end do end do - end do -else - stop '[vllmatsra] error' -end if + else + do ipan = 0, npan + do lm1 = 1, lmsize + qdllp(lm1,lm1,ipan) = qdllp(lm1,lm1,ipan) + qcone + end do + end do + do ipan = 1, npan + qcllptemp(:, :) = qcllp(:, :, ipan) + qdllptemp(:, :) = qdllp(:, :, ipan) + qcllp(:, :,ipan) = qcllptemp(:, :)*(qcone + qcone) + qdllp(:, :,ipan) = qdllptemp(:, :)*(qcone + qcone) + call cqgemm(lmsize, lmsize, lmsize, -qcone, qcllptemp, lmsize, qdllp(1,1,0), lmsize, qcone, qcllp(1,1,ipan), lmsize) + call cqgemm(lmsize, lmsize, lmsize, -qcone, qdllptemp, lmsize, qdllp(1,1,0), lmsize, qcone, qdllp(1,1,ipan), lmsize) + end do -vll=(0.0D0,0d0) + cllp = qcllp + do ipan = 1, npan + qyif(:,:,:) = yif(:,:,:,ipan) + do icheb = 0, ncheb + mn = ipan*ncheb + ipan - icheb + call zgemm('n', 'n', lmsize2, lmsize, lmsize, cone, zif(1,1,icheb,ipan), lmsize2, cllp(1,1,ipan), lmsize, czero, sll(1,1,mn), lmsize2) + call cqgemm(lmsize2, lmsize, lmsize, qcone, qyif(1,1,icheb), lmsize2, qdllp(1,1,ipan), lmsize, qczero, qsll, lmsize2) + sll(:,:,mn) = sll(:,:,mn) + qsll(:,:) + end do + end do + end if +end if -if (cmode=='Ref=0') then - vll(1:lmsize,1:lmsize,:)= vll0 !/cvlight +if(allocated(work)) deallocate( work ) +if(allocated(betainv)) deallocate( betainv ) +if(allocated(betainv_save)) deallocate( betainv_save ) +if(allocated(cllp)) deallocate( cllp ) +if(allocated(dllp)) deallocate( dllp ) +if(allocated(cllptemp)) deallocate( cllptemp ) +if(allocated(dllptemp)) deallocate( dllptemp ) +if(allocated(mihvy)) deallocate( mihvy ) +if(allocated(mihvz)) deallocate( mihvz ) +if(allocated(mijvy)) deallocate( mijvy ) +if(allocated(mijvz)) deallocate( mijvz ) - do ir=1,nrmax - do ival=1,lmsize - lval=loflm(ival) - Mass =cone+(eryd-vll0(ival,ival,ir))/cvlight**2 - Mass0=cone+eryd/cvlight**2 +if(allocated(yif)) deallocate( yif ) +if(allocated(zif)) deallocate( zif ) - !************************************************************************************ - ! Conventional potential matrix - !************************************************************************************ +if(allocated(qcone)) deallocate (qcone) +if(allocated(qczero)) deallocate (qczero) +if(allocated(qmihvy)) deallocate (qmihvy) +if(allocated(qmihvz)) deallocate (qmihvz) +if(allocated(qmijvy)) deallocate (qmijvy) +if(allocated(qmijvz)) deallocate (qmijvz) +if(allocated(qyif)) deallocate (qyif) +if(allocated(qbetainv)) deallocate (qbetainv) +if(allocated(qbetainv_save)) deallocate (qbetainv_save) +if(allocated(qsll)) deallocate (qsll) +if(allocated(qcllp)) deallocate (qcllp) +if(allocated(qdllp)) deallocate (qdllp) +if(allocated(qcllptemp)) deallocate (qcllptemp) +if(allocated(qdllptemp)) deallocate (qdllptemp) + +end subroutine sll_global_solutions + + SUBROUTINE CQGEMM (M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC ) + IMPLICIT NONE +! .. Scalar Arguments .. + INTEGER M, N, K, LDA, LDB, LDC + COMPLEX*32 ALPHA, BETA +! .. Array Arguments .. + COMPLEX*32 A( LDA, * ), B( LDB, * ), C( LDC, * ) +! .. +! .. Local Scalars .. + COMPLEX*32 TEMP + INTEGER I, J, L +! .. Parameters .. + COMPLEX*32 ONE + PARAMETER ( ONE = ( 1.0Q+0, 0.0Q+0 ) ) + COMPLEX*32 ZERO + PARAMETER ( ZERO = ( 0.0Q+0, 0.0Q+0 ) ) +! .. +! + IF( ALPHA.EQ.ZERO )THEN + IF( BETA.EQ.ZERO )THEN + DO 20, J = 1, N + DO 10, I = 1, M + C( I, J ) = ZERO + 10 CONTINUE + 20 CONTINUE + ELSE + DO 40, J = 1, N + DO 30, I = 1, M + C( I, J ) = BETA*C( I, J ) + 30 CONTINUE + 40 CONTINUE + END IF + RETURN + END IF + DO 90, J = 1, N + IF( BETA.EQ.ZERO )THEN + DO 50, I = 1, M + C( I, J ) = ZERO + 50 CONTINUE + ELSE IF( BETA.NE.ONE )THEN + DO 60, I = 1, M + C( I, J ) = BETA*C( I, J ) + 60 CONTINUE + END IF + DO 80, L = 1, K + IF( B( L, J ).NE.ZERO )THEN + TEMP = ALPHA*B( L, J ) + DO 70, I = 1, M + C( I, J ) = C( I, J ) + TEMP*A( I, L ) + 70 CONTINUE + END IF + 80 CONTINUE + 90 CONTINUE + RETURN + END + + subroutine sll_local_solutions(vll,tau,drpan2,csrc1,slc1sum, & + mihvy,mihvz,mijvy,mijvz, & + yif,zif, & + ncheb,ipan,lmsize,lmsize2,nrmax, & + nvec,jlk_index,hlk,jlk,hlk2,jlk2,gmatprefactor, & + LBESSEL,use_sratrick1) +implicit none + integer :: ncheb ! number of chebyshev nodes + integer :: lmsize ! lm-components * nspin + integer :: lmsize2 ! lmsize * nvec + integer :: nvec ! spinor integer +! nvec=1 non-rel, nvec=2 for sra and dirac + integer :: nrmax ! total number of rad. mesh points - vll(lmsize+ival,lmsize+ival,ir)= -vll0(ival,ival,ir)/cvlight**2 ! TEST 9/22/2011 - vll(ival,ival,ir)=vll(ival,ival,ir)+ (1.0D0/Mass-1.0D0/Mass0)*lval*(lval+1)/rmesh(ir)**2 + integer :: LBESSEL, use_sratrick1 ! dimensions etc., needed only for host code interface - !************************************************************************************ - ! The pertubation matrix is changed in the following way - ! - ! from / V11 V12 \ to / V21 V22 \ - ! \ V21 V22 / \-V11 -V12 / - ! because of the convention used for the left solution - !************************************************************************************ - end do !ival - end do !ir -elseif (cmode=='Ref=Vsph') then - vll(lmsize+1:2*lmsize,1:lmsize,:)=vll0 -endif + double complex,parameter:: cone=(1.0d0,0.0d0),czero=(0.0d0,0.0d0) +! running indices + integer ivec, ivec2 + integer l1,l2,lm1,lm2,lm3 + integer info,icheb2,icheb,ipan,mn,nplm -end subroutine vllmatsra +! source terms + double complex :: gmatprefactor ! prefactor of green function +! non-rel: = kappa = sqrt e + DOUBLE COMPLEX :: HLK(LBESSEL,NRMAX), & + JLK(LBESSEL,NRMAX), & + HLK2(LBESSEL,NRMAX), & + JLK2(LBESSEL,NRMAX) -subroutine rllsllsourceterms(nsra,nvec,eryd,rmesh,nrmax,nrmaxd,lmax,lmsize,use_fullgmat,jlk_index,hlk,jlk,hlk2,jlk2,GMATPREFACTOR) -implicit none -! ************************************************************************ -! calculates the source terms J,H and the left solution J2, H2 for: -! - non-relativistic -! - scalar-relativistic -! - full-relativistic -! calculations -! ************************************************************************ -double complex,parameter :: ci=(0.0d0,1.0d0) -double precision :: cvlight -parameter (cvlight=274.0720442D0) -integer :: nsra,lmax,nrmax,nrmaxd,nvec -double complex :: eryd -double precision :: rmesh(nrmaxd) -integer :: jlk_index(2*lmsize) -integer :: l1,lm1,m1,ivec,ispinfullgmat,ir -integer :: use_fullgmat -integer :: lmsize -double complex :: ek,ek2,gmatprefactor -double complex :: hlk(1:4*(lmax+1),nrmax),jlk(1:4*(lmax+1),nrmax) -double complex :: hlk2(1:4*(lmax+1),nrmax),jlk2(1:4*(lmax+1),nrmax) + INTEGER JLK_INDEX(2*LMSIZE) -if (nsra==2) then - nvec=2 -elseif (nsra==1) then - nvec=1 -end if + double complex :: vll(lmsize*nvec,lmsize*nvec,nrmax) ! potential term in 5.7 + + double complex :: & + mihvy(lmsize,lmsize),mihvz(lmsize,lmsize), & + mijvy(lmsize,lmsize),mijvz(lmsize,lmsize), & + yif(lmsize2,lmsize,0:ncheb), & + zif(lmsize2,lmsize,0:ncheb) + double complex :: & + srv(0:ncheb,lmsize2,0:ncheb,lmsize2), & + srv1(0:ncheb,lmsize,0:ncheb,lmsize), & + yill1(0:ncheb,lmsize,lmsize), zill1(0:ncheb,lmsize,lmsize), & + yill2(0:ncheb,lmsize,lmsize), zill2(0:ncheb,lmsize,lmsize), & + yill(0:ncheb,lmsize2,lmsize), zill(0:ncheb,lmsize2,lmsize), & + vjli(lmsize,lmsize2,0:ncheb), vhli(lmsize,lmsize2,0:ncheb), & + vjli_yill1(lmsize,lmsize), vhli_yill1(lmsize,lmsize), & + vjli_zill1(lmsize,lmsize), vhli_zill1(lmsize,lmsize), & + yill1temp(lmsize,lmsize), zill1temp(lmsize,lmsize) + + double complex :: & + jlmkmn(0:ncheb,lmsize2,0:ncheb), & + hlmkmn(0:ncheb,lmsize2,0:ncheb) + +! chebyshev arrays + double complex zslc1sum(0:ncheb) + double precision drpan2 + double precision & + csrc1(0:ncheb,0:ncheb), & ! Integration matrix from right ( C*S_R*C^-1 in eq. 5.54) + tau(0:ncheb), & ! Radial mesh points + slc1sum(0:ncheb),taucsrcr,tau_icheb + double complex :: gf_tau_icheb - lm1 = 1 - do ivec=1,nvec - do ispinfullgmat=0,use_fullgmat - do l1 = 0,lmax - do m1 = -l1,l1 - jlk_index(lm1) = l1+(ivec-1)*(lmax+1)+1 - lm1 = lm1 + 1 - end do - end do - end do!ispinorbit=0,use_fullgmat - end do !nvec + integer ipiv(0:ncheb,lmsize2) + integer :: use_sratrick + external zgetrf,zgetrs,zgemm,zcopy -if (nsra==1) then - ek = sqrt(eryd) - ek2 = sqrt(eryd) -elseif (nsra==2) then - ek = sqrt(eryd+(eryd/cvlight)**2) - ek2 = sqrt(eryd+(eryd/cvlight)**2) *(1.0d0+eryd/cvlight**2) +if ( lmsize==1 ) then + use_sratrick=0 +else + use_sratrick=use_sratrick1 end if - +! initialization + + vhli=czero + vjli=czero -do ir = 1,nrmax + if (use_sratrick==0) then - call beshank(hlk(:,ir),jlk(:,ir),ek*rmesh(ir),lmax) - if (nsra==2) then - call beshank_smallcomp(hlk(:,ir),jlk(:,ir),& - ek*rmesh(ir),rmesh(ir),eryd,lmax) + yill=czero + zill=czero + else + yill1=czero + zill1=czero + yill2=czero + zill2=czero + end if + +!--------------------------------------------------------------------- +! 1. prepare VJLR, VNL, VHLR, which appear in the integrands +! TAU(K,IPAN) is used instead of TAU(K,IPAN)**2, which directly gives +! RLL(r) and SLL(r) multiplied with r. TAU is the radial mesh. +! +! 2. prepare the source terms YR, ZR, YI, ZI +! because of the conventions used by +! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) +! a factor sqrt(E) is included in the source terms +! this factor is removed by the definition of ZSLC1SUM given below +! +!vjlr = \kappa * J * V = \kappa * r * j *V +!vhlr = \kappa * H * V = \kappa * r * h *V +! +! i.e. prepare terms kappa*J*DV, kappa*H*DV appearing in 5.11, 5.12. + + do icheb = 0,ncheb + mn = ipan*ncheb + ipan - icheb + tau_icheb = tau(icheb) + gf_tau_icheb = gmatprefactor*tau_icheb + + do ivec2=1,nvec + do lm2 = 1,lmsize + do ivec=1,nvec + do lm1 = 1,lmsize + l1 = jlk_index( lm1+lmsize*(ivec-1) ) + vjli(lm1,lm2+lmsize*(ivec2-1),icheb) = vjli(lm1,lm2+lmsize*(ivec2-1),icheb) + & + gf_tau_icheb*jlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) + vhli(lm1,lm2+lmsize*(ivec2-1),icheb) = vhli(lm1,lm2+lmsize*(ivec2-1),icheb) + & + gf_tau_icheb*hlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) + end do + end do + end do + end do !nvec + +! calculation of the J (and H) matrix according to equation 5.69 (2nd eq.) + if ( use_sratrick==0 ) then + do ivec=1,nvec ! index for large/small component + do lm1 = 1,lmsize + l1 = jlk_index( lm1+lmsize*(ivec-1) ) + yill(icheb,lm1+lmsize*(ivec-1),lm1) = tau_icheb*hlk(l1,mn) + zill(icheb,lm1+lmsize*(ivec-1),lm1) = tau_icheb*jlk(l1,mn) + end do + end do !ivec=1,nvec + elseif ( use_sratrick==1 ) then + do lm1 = 1,lmsize + l1 = jlk_index( lm1 ) + l2 = jlk_index( lm1+lmsize ) + yill1(icheb,lm1,lm1) = tau_icheb*hlk(l1,mn) + zill1(icheb,lm1,lm1) = tau_icheb*jlk(l1,mn) + yill2(icheb,lm1,lm1) = tau_icheb*hlk(l2,mn) + zill2(icheb,lm1,lm1) = tau_icheb*jlk(l2,mn) + end do end if + end do ! icheb - do l1 = 1,nvec*(lmax+1) - hlk(l1,ir) = -ci*hlk(l1,ir) +! calculation of A in 5.68 + if ( use_sratrick==0 ) then + do icheb2 = 0,ncheb + do icheb = 0,ncheb + taucsrcr = tau(icheb)*csrc1(icheb,icheb2)*drpan2 + mn = ipan*ncheb + ipan - icheb + do lm2 = 1,lmsize2 + do ivec=1,nvec + do lm3 = 1,lmsize + lm1=lm3+(ivec-1)*lmsize + l1 = jlk_index(lm1) + srv(icheb,lm1,icheb2,lm2) = & + taucsrcr*(-jlk(l1,mn)*vhli(lm3,lm2,icheb2) & + +hlk(l1,mn)*vjli(lm3,lm2,icheb2)) + end do + end do + end do + end do end do - - if (nsra==1) then - do l1 = 1,nvec*(lmax+1) - jlk2(l1,ir) = jlk(l1,ir) - hlk2(l1,ir) = hlk(l1,ir) + do lm1 = 1,lmsize2 + do icheb = 0,ncheb + srv(icheb,lm1,icheb,lm1) = srv(icheb,lm1,icheb,lm1) + 1.d0 end do - else if (nsra==2) then - do l1 = 1,lmax+1 - jlk2(l1,ir) = jlk(l1,ir) - hlk2(l1,ir) = hlk(l1,ir) end do - do l1 = lmax+2,2*(lmax+1) - jlk2(l1,ir) = -jlk(l1,ir) - hlk2(l1,ir) = -hlk(l1,ir) + elseif ( use_sratrick==1 ) then + do icheb2 = 0,ncheb + do icheb = 0,ncheb + taucsrcr = tau(icheb)*csrc1(icheb,icheb2)*drpan2 + mn = ipan*ncheb + ipan - icheb + do lm1 = 1,lmsize + l1 = jlk_index(lm1) + jlmkmn(icheb,lm1,icheb2) = taucsrcr*jlk(l1,mn) + hlmkmn(icheb,lm1,icheb2) = taucsrcr*hlk(l1,mn) + end do + end do + end do + do lm2 = 1,lmsize + do icheb2 = 0,ncheb + do lm1 = 1,lmsize + do icheb = 0,ncheb + srv1(icheb,lm1,icheb2,lm2) = & + -jlmkmn(icheb,lm1,icheb2)*vhli(lm1,lm2,icheb2) & + +hlmkmn(icheb,lm1,icheb2)*vjli(lm1,lm2,icheb2) + end do + end do + end do + end do + do lm1 = 1,lmsize + do icheb = 0,ncheb + srv1(icheb,lm1,icheb,lm1) = srv1(icheb,lm1,icheb,lm1) + 1.d0 + end do end do - end if - -end do -gmatprefactor=ek2 -end subroutine rllsllsourceterms - -SUBROUTINE calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,z,c,e, & - rnew,vins,ncheb,npan_tot,rpan_intervall, & - jlk_index,hlk,jlk,hlk2,jlk2,gmatprefactor,tmat, & - use_sratrick) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-18 Time: 14:28:30 - -IMPLICIT NONE - -INTEGER, INTENT(IN) :: nsra -INTEGER, INTENT(IN) :: irmdnew -INTEGER, INTENT(IN OUT) :: nrmaxd -INTEGER, INTENT(IN) :: lmax -INTEGER, INTENT(IN) :: nspin -DOUBLE PRECISION, INTENT(IN) :: z -DOUBLE PRECISION, INTENT(IN) :: c -DOUBLE COMPLEX, INTENT(OUT) :: e -!INTEGER, INTENT(IN) :: lmpotd -!INTEGER, INTENT(IN OUT) :: lmmaxso -DOUBLE PRECISION, INTENT(IN) :: rnew(:) -DOUBLE PRECISION, INTENT(IN) :: vins(:,:,:) -INTEGER, INTENT(IN) :: ncheb -INTEGER, INTENT(IN) :: npan_tot -DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(0:) -INTEGER, INTENT(OUT) :: jlk_index(:) -DOUBLE COMPLEX, INTENT(IN OUT) :: hlk(:,:) -DOUBLE COMPLEX, INTENT(IN OUT) :: jlk(:,:) -DOUBLE COMPLEX, INTENT(IN OUT) :: hlk2(:,:) -DOUBLE COMPLEX, INTENT(IN OUT) :: jlk2(:,:) -DOUBLE COMPLEX, INTENT(IN OUT) :: gmatprefactor -DOUBLE COMPLEX, INTENT(IN OUT) :: tmat(:) -INTEGER, INTENT(IN OUT) :: use_sratrick -! construct wavefunctions for spherical potentials - - -! local -INTEGER :: lmsize,lmsize2,nvec -INTEGER :: ivec,lval,ir,ispin,lspin,lsra,i,l1,m1,lm1 -INTEGER, allocatable :: jlk_indextemp(:) -DOUBLE COMPLEX, allocatable :: vll0(:,:,:) -DOUBLE COMPLEX, allocatable :: vll(:,:,:) -DOUBLE COMPLEX, allocatable :: rlltemp(:,:,:),slltemp(:,:,:), & - hlktemp(:,:),jlktemp(:,:), hlk2temp(:,:),jlk2temp(:,:), & - hlknew(:,:),jlknew(:,:) -DOUBLE COMPLEX, allocatable :: tmattemp(:,:) - -lmsize=1 -IF (nsra == 2) THEN - lmsize2=2 - nvec=2 -ELSE - lmsize2=1 - nvec=1 -END IF -allocate (rlltemp(lmsize2,lmsize,irmdnew)) -allocate (slltemp(lmsize2,lmsize,irmdnew)) -allocate (hlktemp(nvec,irmdnew)) -allocate (jlktemp(nvec,irmdnew)) -allocate (hlk2temp(nvec,irmdnew)) -allocate (jlk2temp(nvec,irmdnew)) -allocate (jlk_indextemp(lmsize2)) -allocate (tmattemp(lmsize,lmsize)) -allocate (hlknew(nvec*nspin*(lmax+1),irmdnew)) -allocate (jlknew(nvec*nspin*(lmax+1),irmdnew)) - -DO ivec=1,nvec - jlk_indextemp(ivec)=ivec -END DO -allocate(vll0(lmsize,lmsize,irmdnew)) -IF (nsra == 2) THEN - allocate(vll(2*lmsize,2*lmsize,irmdnew)) -ELSE - allocate(vll(lmsize,lmsize,irmdnew)) -END IF -! spin loop -DO ispin=1,nspin - - lspin=(lmax+1)*(ispin-1) - lsra=(lmax+1)*nvec -! each value of l, the Lippmann-Schwinger equation is solved using -! the free-potential wavefunctions and potentials corresponding to l-value - DO lval=0,lmax - - DO ir=1,irmdnew - vll0(lmsize,lmsize,ir)=vins(ir,1,ispin)-2D0*z/rnew(ir) - END DO - - IF (nsra == 2) THEN - CALL vllmatsra(vll0,vll,rnew,lmsize,irmdnew,nrmaxd, & - e,c,lmax,lval,'Ref=0') - ELSE - vll(:,:,:)=vll0(:,:,:) - END IF - - jlktemp(1,:)=jlk(lval+1,:) - hlktemp(1,:)=hlk(lval+1,:) - jlk2temp(1,:)=jlk2(lval+1,:) - hlk2temp(1,:)=hlk2(lval+1,:) - IF (nsra == 2) THEN - jlktemp(2,:)=jlk(lmax+lval+2,:) - hlktemp(2,:)=hlk(lmax+lval+2,:) - jlk2temp(2,:)=jlk2(lmax+lval+2,:) - hlk2temp(2,:)=hlk2(lmax+lval+2,:) - END IF - CALL rllsll(rpan_intervall,rnew,vll,rlltemp,slltemp,tmattemp, & - ncheb,npan_tot,lmsize,lmsize2,nvec,irmdnew,nvec, & - jlk_indextemp,hlktemp,jlktemp,hlk2temp,jlk2temp, & - gmatprefactor,'1','1',use_sratrick) - - DO ir=1,irmdnew - hlknew(lspin+lval+1,ir)=slltemp(1,1,ir)/rnew(ir) - jlknew(lspin+lval+1,ir)=rlltemp(1,1,ir)/rnew(ir) - END DO - IF (nsra == 2) THEN - DO ir=1,irmdnew - hlknew(lspin+lsra+lval+1,ir)=slltemp(2,1,ir)/rnew(ir) - jlknew(lspin+lsra+lval+1,ir)=rlltemp(2,1,ir)/rnew(ir) - END DO - END IF - tmat(lspin+lval+1)=tmattemp(1,1) - END DO ! LMAX -END DO ! NSPIN - -lm1=1 -DO ivec=1,nvec - DO i=1,2 - DO l1=0,lmax - DO m1=-l1,l1 - jlk_index(lm1)=l1+(ivec-1)*nspin*(lmax+1)+(i-1)*(lmax+1)+1 - lm1=lm1+1 - END DO - END DO - END DO -END DO -DO ir=1,irmdnew - DO l1=1,nvec*(lmax+1)*nspin - hlk(l1,ir)=hlknew(l1,ir) - jlk(l1,ir)=jlknew(l1,ir) - END DO -END DO -IF (nsra == 2) THEN - DO ir=1,irmdnew - DO l1=1,(lmax+1)*nspin - hlk2(l1,ir)=-hlknew(l1+lmax+1,ir) - jlk2(l1,ir)=-jlknew(l1+lmax+1,ir) - END DO - DO l1=nspin*(lmax+1)+1,nvec*(lmax+1)*nspin - hlk2(l1,ir)=hlknew(l1-(lmax+1)*nspin,ir) - jlk2(l1,ir)=jlknew(l1-(lmax+1)*nspin,ir) - END DO - END DO -ELSE - DO ir=1,irmdnew - DO l1=1,nvec*(lmax+1)*nspin - hlk2(l1,ir)=-hlknew(l1,ir) - jlk2(l1,ir)=-jlknew(l1,ir) - END DO - END DO -END IF - -deallocate (rlltemp) -deallocate (slltemp) -deallocate (hlktemp) -deallocate (jlktemp) -deallocate (hlk2temp) -deallocate (jlk2temp) -deallocate (jlk_indextemp) -deallocate (tmattemp) -deallocate (hlknew) -deallocate (jlknew) -deallocate (vll0) -deallocate (vll) -END SUBROUTINE calcsph - -#define hostcode ! comment this out to use the impurity code interface -! choose between interface for impurity and host code (different calling lists) -#ifndef hostcode - MODULE MOD_RLL_ONLY - CONTAINS - SUBROUTINE RLL_ONLY(RPANBOUND,RMESH,VLL,RLL,TLLP, & - NCHEB,NPAN,LMSIZE,LMSIZE2,NRMAX, & - nvec,jlk_index,hlk,jlk,hlk2,jlk2,GMATPREFACTOR, & - cmoderll,cmodesll,cmodetest,idotime) -#else - SUBROUTINE RLL_ONLY(RPANBOUND,RMESH,VLL,RLL,TLLP, & - NCHEB,NPAN,LMSIZE,LMSIZE2,LBESSEL,NRMAX, & - NVEC,JLK_INDEX,HLK,JLK,HLK2,JLK2,GMATPREFACTOR, & - CMODERLL,CMODESLL,USE_SRATRICK1) ! & - ! ALPHAGET) ! LLY -#endif -! ************************************************************************ -! radial wave functions by the integral equation method of -! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) -! which has been extended for KKR using non-sperical potentials. -! Further information can be found in -! -! David Bauer, -! "Development of a relativistic full-potential first-principles multiple scattering -! Green function method applied to complex magnetic textures of nano structures -! at surfaces", PhD Thesis, 2014 -! -! http://darwin.bth.rwth-aachen.de/opus3/volltexte/2014/4925/ -! -! -! -! ************************************************************************ -! This routine solves the following two equations: -! -! ULL(r) = J(r) - PRE * J(r) * int_0^r( dr' r'^2 H2(r') * op(V(r')) * ULL(r') ) -! + PRE * H(r) * int_0^r( dr' r'^2 J2(r') * op(V(r')) * ULL(r') ) -! -! where the integral int_0^r() runs from 0 to r -! ************************************************************************ -! Potential matrix : VLL(LMSIZE*NVEC,LMSIZE*NVEC) -! LMSIZE = LMMAX (number of LM components) x Number of spin components -! LMSIZE2 = NVEC* LMSIZE -! NVEC is 2 for a spinor and 1 in case of a non-rel. calculation -! -! ************************************************************************ -! Green function prefacor PRE=GMATPREFACTOR (scalar value) -! tipically \kappa for non-relativistic and M_0 \kappa for SRA -! -! ************************************************************************ - - -! ************************************************************************ -! The discretization of the Lippmann-Schwinger equation results in a matrix -! equation which is solved in this routine. Further information is given -! in section 5.2.3, page 90 of Bauer, PhD -! -! Source terms : -! right solution: J, H (nvec*lmsize,lmsize) or (lmsize,nvec*lmsize) -! left solution: J2,H2 (lmsize,nvec*lmsize) or (nvec*lmsize,lmsize) -! -! Example: -! The source term J is for LMSIZE=3 and NVEC=2 given by: -! J = / jlk(jlk_index(1)) \ -! | 0 jlk(jlk_index(2)) | -! | 0 0 jlk(jlk_index(3)) | -! | jlk(jlk_index(4)) | -! | 0 jlk(jlk_index(5)) | -! \ 0 0 jlk(jlk_index(6)) / -! -! first 3 rows are for the large and the last 3 rows for the small component -! ************************************************************************ -! Operator op() can be chosen to be a unity or a transpose operation -! The unity operation is used to calculate the right solution -! The transpose operation is used to calculate the left solution -! ************************************************************************ -! RMESH - radial mesh -! RPANBOUND - panel bounds RPANBOUND(0) left panel border of panel 1 -! RPANBOUND(1) right panel border of panel 1 -! NCHEB - highes chebyshev polynomial -! number of points per panel = NCHEB + 1 -! NPAN - number of panels -! LMSIZE - number of colums for the source matrix J etc... -! LMSIZE2 - number of rows for the source matrix J etc... -! NRMAX - total number of radial points (NPAN*(NCHEB+1)) -! NVEC - number of LMSIZE*LMSIZE blocks in J (LMSIZE2=NVEC*LMSIZE) -! ************************************************************************ -#ifndef hostcode -use mod_beshank ! calculates bessel and hankel func. -use mod_chebint ! chebyshev integration routines -use mod_config, only: config_testflag ! reads if testflags are present -use mod_physic_params,only: cvlight ! speed of light -use sourceterms -use mod_chebyshev -#endif -!use mod_timing ! timing routine -#ifdef CPP_hybrid -!use omp_lib ! omp functions -#endif -implicit none - integer :: ncheb ! number of chebyshev nodes - integer :: npan ! number of panels - integer :: lmsize ! lm-components * nspin - integer :: lmsize2 ! lmsize * nvec - integer :: nvec ! spinor integer - ! nvec=1 non-rel, nvec=2 for sra and dirac - integer :: nrmax ! total number of rad. mesh points -#ifdef hostcode - integer :: LBESSEL, use_sratrick1 ! dimensions etc., needed only for host code interface -#endif - - double complex,parameter:: ci= (0.0d0,1.0d0), &! complex i - cone=(1.0d0,0.0d0),&! 1 - czero=(0.0d0,0.0d0) ! 0 - ! running indices - integer ivec, ivec2 - integer l1,l2,lm1,lm2,lm3 - integer info,icheb2,icheb,ipan,mn,nm,nplm - - ! source terms - double complex :: gmatprefactor ! prefactor of green function - ! non-rel: = kappa = sqrt e -#ifndef hostcode - double complex :: hlk(:,:), jlk(:,:), & ! right sol. source terms - hlk2(:,:), jlk2(:,:) ! left sol. source terms - ! (tipically bessel and hankel fn) -#else - DOUBLE COMPLEX :: HLK(LBESSEL,NRMAX), & - JLK(LBESSEL,NRMAX), & - HLK2(LBESSEL,NRMAX), & - JLK2(LBESSEL,NRMAX) -#endif - -#ifndef hostcode - integer jlk_index(:) ! mapping array l = jlk_index(lm) - ! in: lm-index - ! corresponding l-index used hlk,.. - ! hlk(l) = jlk_index(lm) -#else - INTEGER JLK_INDEX(2*LMSIZE) -#endif - - character(len=1) :: cmoderll,cmodesll,cmodetest ! These define the op(V(r)) in the eqs. above - ! (comment in the beginning of this subroutine) - ! cmoderll ="1" : op( )=identity for reg. solution - ! cmoderll ="T" : op( )=transpose in L for reg. solution - ! cmodesll: same for irregular - - double complex :: rll(lmsize2,lmsize,nrmax), & ! reg. fredholm sol. - tllp(lmsize,lmsize), & ! t-matrix - vll(lmsize*nvec,lmsize*nvec,nrmax) ! potential term in 5.7 - ! bauer, phd - double complex,allocatable :: ull(:,:,:) ! reg. volterra sol. - - double complex,allocatable :: & - work(:,:), & - work2(:,:), & - allp(:,:,:),bllp(:,:,:), & ! eq. 5.9, 5.10 for reg. sol - slv(:,:,:,:), & ! a in eq 5.68 - slv1(:,:,:,:), & !**************** -! slv2(:,:,:,:), & ! used for sra trick - mrnvy(:,:,:),mrnvz(:,:,:), & ! *************** - mrjvy(:,:,:),mrjvz(:,:,:), & ! eq. 5.19-5.22 - yrll(:,:,:),zrll(:,:,:), & ! - yrll1(:,:,:),zrll1(:,:,:), & - yrll2(:,:,:),zrll2(:,:,:), & - vhlr(:,:,:), & ! vhlr = h * v (regular sol.) - vjlr(:,:,:) ! vjlr = j * v (regular sol.) - double complex,allocatable :: & - vhlr_yrll1(:,:), & ! - vhlr_zrll1(:,:), & ! - vjlr_yrll1(:,:), & ! - vjlr_zrll1(:,:), & ! - yrll1temp(:,:), & ! - zrll1temp(:,:) ! - double complex,allocatable :: yrf(:,:,:,:), & ! source terms (different array - zrf(:,:,:,:) ! ordering) - ! chebyshev arrays - double complex zslc1sum(0:ncheb) - double precision c1(0:ncheb,0:ncheb),rpanbound(0:npan) - double precision cslc1(0:ncheb,0:ncheb), & ! Integration matrix from left ( C*S_L*C^-1 in eq. 5.53) - csrc1(0:ncheb,0:ncheb), & ! Same from right ( C*S_R*C^-1 in eq. 5.54) - tau(0:ncheb,0:npan), & ! Radial mesh point - slc1sum(0:ncheb),rmesh(nrmax),taucslcr - - integer ipiv(0:ncheb,lmsize2) - integer,allocatable :: ipiv2(:) -! logical test -! integer :: ierror - integer :: use_sratrick -! integer :: idotime - integer,parameter :: directsolv=1 -#ifdef hostcode -! DOUBLE COMPLEX ALPHAGET(LMSIZE,LMSIZE) ! LLY -#endif - -#ifdef CPP_hybrid -! openMP variable --sacin 23/04/2015 -! integer :: thread_id, number_of_openmp_threads,number_of_processor -#endif - - external zgetrf,zgetrs - intrinsic abs,atan,cos,dimag,exp,max,min,sin,sqrt - -! *********************************************************************** -! SRA trick -! *********************************************************************** -! on page 68 of Bauer, PhD, a method is described how to speed up the -! calculations in case of the SRA. A similar approach is implemented -! here by using Eq. 4.132 and substituting DV from 4.133, and discretising -! the radial mesh of the Lippmann-Schwinger eq. according to 5.68. -! The Lippmann-Schwinger equation leads to a matrix inversion -! problem. The matrix M which needs to be inverted has a special form -! if the SRA approximation is used: -! -! matrix A ( C 0) (same as in eq. 5.68) -! ( B 1) -! (C, B are matricies here) -! -! inverse of A is (C^-1 0 ) -! (-B C^-1 1 ) -! Thus, it is sufficient to only inverse the matrix C which saves computational -! time. This is refered to as the SRA trick. -! *********************************************************************** -! in future implementation equation 4.134 is supposed to be -! implemented which should lead to an additional speed-up. -! *********************************************************************** - -#ifndef hostcode -if ( config_testflag('nosph') .or. lmsize==1 ) then - use_sratrick=0 -elseif ( .not. config_testflag('nosph') ) then - use_sratrick=1 -else - stop '[rll] use_sratrick error' -end if -#else -if ( lmsize==1 ) then - use_sratrick=0 -else - use_sratrick=use_sratrick1 -end if -#endif - -!#ifdef hostcode -!! turn timing output off if in the host code -!idotime = 0 -!#endif -!if (idotime==1) call timing_start('rll') - - -do ipan = 1,npan - do icheb = 0,ncheb - mn = ipan*ncheb + ipan - icheb - tau(icheb,ipan) = rmesh(mn) - end do -end do - -call chebint(cslc1,csrc1,slc1sum,c1,ncheb) - - - -if(.not.allocated(ull)) allocate ( ull(lmsize2,lmsize,nrmax) ) - -if ( use_sratrick==0 ) then - if(.not.allocated(slv)) allocate ( slv(0:ncheb,lmsize2,0:ncheb,lmsize2) ) -elseif ( use_sratrick==1 ) then - if(.not.allocated(work2)) allocate ( work2((ncheb+1)*lmsize,(ncheb+1)*lmsize), ipiv2((ncheb+1)*lmsize) ) - if(.not.allocated(slv1)) allocate ( slv1(0:ncheb,lmsize,0:ncheb,lmsize) ) -! if(.not.allocated(slv2)) allocate ( slv2(0:ncheb,lmsize,0:ncheb,lmsize) ) - if(.not.allocated(yrll1)) allocate ( yrll1(0:ncheb,lmsize,lmsize), zrll1(0:ncheb,lmsize,lmsize) ) - if(.not.allocated(yrll2)) allocate ( yrll2(0:ncheb,lmsize,lmsize), zrll2(0:ncheb,lmsize,lmsize) ) -else - stop '[rll] error with testflag sph' -end if - -if(.not.allocated(work)) allocate( work(lmsize,lmsize) ) -if(.not.allocated(allp)) allocate( allp(lmsize,lmsize,0:npan), bllp(lmsize,lmsize,0:npan) ) -if(.not.allocated(mrnvy)) allocate( mrnvy(lmsize,lmsize,npan), mrnvz(lmsize,lmsize,npan) ) -if(.not.allocated(mrjvy)) allocate( mrjvy(lmsize,lmsize,npan), mrjvz(lmsize,lmsize,npan) ) -if(.not.allocated(yrll)) allocate( yrll(0:ncheb,lmsize2,lmsize), zrll(0:ncheb,lmsize2,lmsize) ) -if(.not.allocated(vjlr)) allocate( vjlr(lmsize,lmsize2,0:ncheb), vhlr(lmsize,lmsize2,0:ncheb) ) - -yrll=(0.0d0,0.0d0) -yrll=(0.0d0,0.0d0) - -if(.not.allocated(yrf)) allocate( yrf(lmsize2,lmsize,0:ncheb,npan) ) -if(.not.allocated(zrf)) allocate( zrf(lmsize2,lmsize,0:ncheb,npan) ) - - - -#ifdef CPP_hybrid -!call omp_set_num_threads(16) -!number_of_openmp_threads = omp_get_num_threads() -!write(*,*) 'number_of_openmp_threads: ', number_of_openmp_threads -!$NOOMP PARALLEL DEFAULT (PRIVATE) & -!$NOOMP& SHARED(tau,npan,rpanbound,mrnvy,mrnvz,mrjvy,mrjvz,yrf, & -!$NOOMP& zrf,nvec,lmsize,lmsize2,ncheb,jlk,jlk2,jlk_index,vll,gmatprefactor,hlk,hlk2,cslc1,csrc1,slc1sum, & -!$NOOMP& cmoderll,cmodesll,cmodetest,use_sratrick, rmesh) - -!thread_id = omp_get_thread_num() -#endif - -if(.not.allocated(ull)) allocate ( ull(lmsize2,lmsize,nrmax) ) - -if ( use_sratrick==0 ) then - if(.not.allocated(slv)) allocate ( slv(0:ncheb,lmsize2,0:ncheb,lmsize2) ) -elseif ( use_sratrick==1 ) then - if(.not.allocated(work2)) allocate ( work2((ncheb+1)*lmsize,(ncheb+1)*lmsize), ipiv2((ncheb+1)*lmsize) ) - if(.not.allocated(slv1)) allocate ( slv1(0:ncheb,lmsize,0:ncheb,lmsize) ) -! if(.not.allocated(slv2)) allocate ( slv2(0:ncheb,lmsize,0:ncheb,lmsize) ) - if(.not.allocated(yrll1)) allocate ( yrll1(0:ncheb,lmsize,lmsize), zrll1(0:ncheb,lmsize,lmsize) ) - if(.not.allocated(yrll2)) allocate ( yrll2(0:ncheb,lmsize,lmsize), zrll2(0:ncheb,lmsize,lmsize) ) -else - stop '[rll] error with testflag sph' -end if - -if(.not.allocated(work)) allocate( work(lmsize,lmsize) ) -if(.not.allocated(allp)) allocate( allp(lmsize,lmsize,0:npan), bllp(lmsize,lmsize,0:npan) ) -if(.not.allocated(mrnvy)) allocate( mrnvy(lmsize,lmsize,npan), mrnvz(lmsize,lmsize,npan) ) -if(.not.allocated(mrjvy)) allocate( mrjvy(lmsize,lmsize,npan), mrjvz(lmsize,lmsize,npan) ) -if(.not.allocated(yrll)) allocate( yrll(0:ncheb,lmsize2,lmsize), zrll(0:ncheb,lmsize2,lmsize) ) -if(.not.allocated(vjlr)) allocate( vjlr(lmsize,lmsize2,0:ncheb), vhlr(lmsize,lmsize2,0:ncheb) ) -if(.not.allocated(vjlr_yrll1)) allocate( vjlr_yrll1(lmsize,lmsize), vhlr_yrll1(lmsize,lmsize) ) -if(.not.allocated(vjlr_zrll1)) allocate( vjlr_zrll1(lmsize,lmsize), vhlr_zrll1(lmsize,lmsize) ) -if(.not.allocated(yrll1temp)) allocate( yrll1temp(lmsize,lmsize), zrll1temp(lmsize,lmsize) ) - -yrll=(0.0d0,0.0d0) -yrll=(0.0d0,0.0d0) - -if(.not.allocated(yrf)) allocate( yrf(lmsize2,lmsize,0:ncheb,npan) ) -if(.not.allocated(zrf)) allocate( zrf(lmsize2,lmsize,0:ncheb,npan) ) - -!if (idotime==1) call timing_start('local') - -! loop over subintervals -#ifdef CPP_hybrid -! openMP pragmas added sachin, parallel region starts earlier to get allocations of arrays right -!$NOOMP DO -#endif -do ipan = 1,npan - -! if (idotime==1) call timing_start('local1') - - ! initialization - - vhlr=czero - vjlr=czero - - if (use_sratrick==0) then - - yrll=czero - zrll=czero - else - yrll1=czero - zrll1=czero - yrll2=czero - zrll2=czero - end if - -!--------------------------------------------------------------------- -! 1. prepare VJLR, VNL, VHLR, which appear in the integrands -! TAU(K,IPAN) is used instead of TAU(K,IPAN)**2, which directly gives -! RLL(r) multiplied with r. TAU is the radial mesh. -! -! 2. prepare the source terms YR, ZR -! because of the conventions used by -! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) -! a factor sqrt(E) is included in the source terms -! this factor is removed by the definition of ZSLC1SUM given below -! -!vjlr = \kappa * J * V = \kappa * r * j *V -!vhlr = \kappa * H * V = \kappa * r * h *V -! -! i.e. prepare terms kappa*J*DV, kappa*H*DV appearing in 5.11, 5.12. - - do icheb = 0,ncheb - mn = ipan*ncheb + ipan - icheb - if (cmoderll=='1') then - do ivec2=1,nvec - do lm2 = 1,lmsize - do ivec=1,nvec - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(ivec-1) ) - vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*jlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) - vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*hlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) - end do - end do - end do - end do - elseif (cmoderll=='T') then ! transposed matrix (might not be needed anymore) - do ivec2=1,nvec - do lm2 = 1,lmsize - do ivec=1,nvec - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(ivec-1) ) - vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*jlk2(l1,mn)*vll(lm2+lmsize*(ivec-1),lm1+lmsize*(ivec2-1),mn) - vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*hlk2(l1,mn)*vll(lm2+lmsize*(ivec-1),lm1+lmsize*(ivec2-1),mn) - end do - end do - end do - end do !nvec - elseif (cmoderll=='0') then ! as a test option - vjlr(:,:,icheb) = czero - vhlr(:,:,icheb) = czero - else - stop '[rll] mode not known' - end if - - ! calculation of the J (and H) matrix according to equation 5.69 (2nd eq.) - if ( use_sratrick==0 ) then - do ivec=1,nvec ! index for large/small component - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(ivec-1) ) - yrll(icheb,lm1+lmsize*(ivec-1),lm1) = tau(icheb,ipan)*jlk(l1,mn) - zrll(icheb,lm1+lmsize*(ivec-1),lm1) = tau(icheb,ipan)*hlk(l1,mn) - end do - end do !ivec=1,nvec - elseif ( use_sratrick==1 ) then - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(1-1) ) - l2 = jlk_index( lm1+lmsize*(2-1) ) - yrll1(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*jlk(l1,mn) - zrll1(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*hlk(l1,mn) - yrll2(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*jlk(l2,mn) - zrll2(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*hlk(l2,mn) - end do - end if - end do ! icheb - - ! calculation of A in 5.68 - if ( use_sratrick==0 ) then - do icheb2 = 0,ncheb - do icheb = 0,ncheb - taucslcr = tau(icheb,ipan)*cslc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 - mn = ipan*ncheb + ipan - icheb - do lm2 = 1,lmsize2 - do ivec=1,nvec - do lm3 = 1,lmsize - lm1=lm3+(ivec-1)*lmsize - l1 = jlk_index(lm1) - slv(icheb,lm1,icheb2,lm2) = & - taucslcr*(jlk(l1,mn)*vhlr(lm3,lm2,icheb2) & - -hlk(l1,mn)*vjlr(lm3,lm2,icheb2)) - end do - end do - end do - end do - end do - do lm1 = 1,lmsize2 - do icheb = 0,ncheb - slv(icheb,lm1,icheb,lm1) = slv(icheb,lm1,icheb,lm1) + 1.d0 - end do - end do - elseif ( use_sratrick==1 ) then - do icheb2 = 0,ncheb - do icheb = 0,ncheb - taucslcr = tau(icheb,ipan)*cslc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 - mn = ipan*ncheb + ipan - icheb - do lm2 = 1,lmsize -! do ivec=1,1 - do lm3 = 1,lmsize -! lm1=lm3+(ivec-1)*lmsize - lm1=lm3 - l1 = jlk_index(lm1) - - ! this is the block to be inverted in SRAtrick. (named C in comment above): - slv1(icheb,lm1,icheb2,lm2) = & - taucslcr*(jlk(l1,mn)*vhlr(lm3,lm2,icheb2) & - -hlk(l1,mn)*vjlr(lm3,lm2,icheb2)) - - end do -! end do - end do - end do - end do -! do icheb2 = 0,ncheb -! do icheb = 0,ncheb -! taucslcr = tau(icheb,ipan)*cslc1(icheb,icheb2) & -! *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 -! mn = ipan*ncheb + ipan - icheb -! do lm2 = 1,lmsize -! do ivec=2,2 -! do lm3 = 1,lmsize -! lm1=lm3+(ivec-1)*lmsize -! lm1=lm3+lmsize -! l1 = jlk_index(lm1) - -! slv2(icheb,lm3,icheb2,lm2) = & -! taucslcr*(jlk(l1,mn)*vhlr(lm3,lm2,icheb2) & -! -hlk(l1,mn)*vjlr(lm3,lm2,icheb2)) - -! end do -! end do -! end do -! end do -! end do - do lm1 = 1,lmsize - do icheb = 0,ncheb - slv1(icheb,lm1,icheb,lm1) = slv1(icheb,lm1,icheb,lm1) + 1.d0 - end do - end do - - else - stop '[rll] error in inversion' - end if - -! if (idotime==1) call timing_pause('local1') -! if (idotime==1) call timing_start('local2') + else + stop '[rllsll] error in inversion' + end if !------------------------------------------------------- ! determine the local solutions -! solve the equations SLV*YRLL=S and SLV*ZRLL=C +! solve the equations SLV*YRLL=S and SLV*ZRLL=C ! and SRV*YILL=C and SRV*ZILL=S ! i.e., solve system A*U=J, see eq. 5.68. if ( use_sratrick==0 ) then nplm = (ncheb+1)*lmsize2 - if (cmoderll/='0') then -! if (idotime==1) call timing_start('inversion') - call zgetrf(nplm,nplm,slv,nplm,ipiv,info) -! if (idotime==1) call timing_stop('inversion','test') - if (info/=0) stop 'rll: zgetrf' - call zgetrs('n',nplm,lmsize,slv,nplm,ipiv,yrll,nplm,info) - call zgetrs('n',nplm,lmsize,slv,nplm,ipiv,zrll,nplm,info) - end if + call zgetrf(nplm,nplm,srv,nplm,ipiv,info) + if (info/=0) stop 'rllsll: zgetrf' + call zgetrs('n',nplm,lmsize,srv,nplm,ipiv,yill,nplm,info) + call zgetrs('n',nplm,lmsize,srv,nplm,ipiv,zill,nplm,info) elseif ( use_sratrick==1 ) then nplm = (ncheb+1)*lmsize - call zgetrf(nplm,nplm,slv1,nplm,ipiv,info) - call zgetrs('n',nplm,lmsize,slv1,nplm,ipiv,yrll1,nplm,info) - call zgetrs('n',nplm,lmsize,slv1,nplm,ipiv,zrll1,nplm,info) - -! call zgemm('n','n',nplm,lmsize,nplm,-cone,slv2, & -! nplm,yrll1,nplm,cone,yrll2,nplm) - -! call zgemm('n','n',nplm,lmsize,nplm,-cone,slv2, & -! nplm,zrll1,nplm,cone,zrll2,nplm) + call zgetrf(nplm,nplm,srv1,nplm,ipiv,info) + call zgetrs('n',nplm,lmsize,srv1,nplm,ipiv,yill1,nplm,info) + call zgetrs('n',nplm,lmsize,srv1,nplm,ipiv,zill1,nplm,info) do icheb2 = 0,ncheb do lm2 = 1,lmsize - do lm1 = 1,lmsize - yrll1temp(lm1,lm2) = yrll1(icheb2,lm1,lm2) - zrll1temp(lm1,lm2) = zrll1(icheb2,lm1,lm2) + do lm1 = 1,lmsize + yill1temp(lm1,lm2) = yill1(icheb2,lm1,lm2) + zill1temp(lm1,lm2) = zill1(icheb2,lm1,lm2) end do end do - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhlr(1,1,icheb2), & - lmsize,yrll1temp,lmsize,czero,vhlr_yrll1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhlr(1,1,icheb2), & - lmsize,zrll1temp,lmsize,czero,vhlr_zrll1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjlr(1,1,icheb2), & - lmsize,yrll1temp,lmsize,czero,vjlr_yrll1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjlr(1,1,icheb2), & - lmsize,zrll1temp,lmsize,czero,vjlr_zrll1,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhli(1,1,icheb2), & + lmsize,yill1temp,lmsize,czero,vhli_yill1,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhli(1,1,icheb2), & + lmsize,zill1temp,lmsize,czero,vhli_zill1,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjli(1,1,icheb2), & + lmsize,yill1temp,lmsize,czero,vjli_yill1,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjli(1,1,icheb2), & + lmsize,zill1temp,lmsize,czero,vjli_zill1,lmsize) do icheb = 0,ncheb - taucslcr = - tau(icheb,ipan)*cslc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 + taucsrcr = tau(icheb)*csrc1(icheb,icheb2)*drpan2 mn = ipan*ncheb + ipan - icheb do lm2 = 1,lmsize do lm3 = 1,lmsize lm1=lm3+lmsize l1 = jlk_index(lm1) - yrll2(icheb,lm3,lm2) = & - yrll2(icheb,lm3,lm2) + & - taucslcr*(jlk(l1,mn)*vhlr_yrll1(lm3,lm2) & - -hlk(l1,mn)*vjlr_yrll1(lm3,lm2)) + yill2(icheb,lm3,lm2) = & + yill2(icheb,lm3,lm2) + & + taucsrcr*(jlk(l1,mn)*vhli_yill1(lm3,lm2) & + -hlk(l1,mn)*vjli_yill1(lm3,lm2)) - zrll2(icheb,lm3,lm2) = & - zrll2(icheb,lm3,lm2) + & - taucslcr*(jlk(l1,mn)*vhlr_zrll1(lm3,lm2) & - -hlk(l1,mn)*vjlr_zrll1(lm3,lm2)) + zill2(icheb,lm3,lm2) = & + zill2(icheb,lm3,lm2) + & + taucsrcr*(jlk(l1,mn)*vhli_zill1(lm3,lm2) & + -hlk(l1,mn)*vjli_zill1(lm3,lm2)) end do end do @@ -2830,16 +2701,16 @@ do ipan = 1,npan end do else - stop '[rll] error in inversion' + stop '[rllsll] error in inversion' end if - ! Reorient indices for later use +! Reorient indices for later use if ( use_sratrick==0 ) then do icheb = 0,ncheb do lm2 = 1,lmsize do lm1 = 1,lmsize2 - yrf(lm1,lm2,icheb,ipan) = yrll(icheb,lm1,lm2) - zrf(lm1,lm2,icheb,ipan) = zrll(icheb,lm1,lm2) + yif(lm1,lm2,icheb) = yill(icheb,lm1,lm2) + zif(lm1,lm2,icheb) = zill(icheb,lm1,lm2) end do end do end do @@ -2849,2943 +2720,2028 @@ do ipan = 1,npan do icheb = 0,ncheb do lm2 = 1,lmsize do lm1 = 1,lmsize - yrf(lm1,lm2,icheb,ipan) = yrll1(icheb,lm1,lm2) - zrf(lm1,lm2,icheb,ipan) = zrll1(icheb,lm1,lm2) - end do - end do - end do - - do icheb = 0,ncheb - do lm2 = 1,lmsize - do lm1 = 1,lmsize - yrf(lm1+lmsize,lm2,icheb,ipan) = yrll2(icheb,lm1,lm2) - zrf(lm1+lmsize,lm2,icheb,ipan) = zrll2(icheb,lm1,lm2) + yif(lm1,lm2,icheb) = yill1(icheb,lm1,lm2) + zif(lm1,lm2,icheb) = zill1(icheb,lm1,lm2) + yif(lm1+lmsize,lm2,icheb) = yill2(icheb,lm1,lm2) + zif(lm1+lmsize,lm2,icheb) = zill2(icheb,lm1,lm2) end do end do end do end if -! if (idotime==1) call timing_pause('local2') -! if (idotime==1) call timing_start('local3') - - ! Calculation of eq. 5.19-5.22 +! Calculation of eq. 5.19-5.22 do icheb = 0,ncheb - zslc1sum(icheb) = slc1sum(icheb) * (rpanbound(ipan)-rpanbound(ipan-1))/ (2.d0) + zslc1sum(icheb) = slc1sum(icheb)*drpan2 end do - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhlr(1,1,0), & - lmsize,yrf(1,1,0,ipan),lmsize2,czero,mrnvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjlr(1,1,0), & - lmsize,yrf(1,1,0,ipan),lmsize2,czero,mrjvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhlr(1,1,0), & - lmsize,zrf(1,1,0,ipan),lmsize2,czero,mrnvz(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjlr(1,1,0), & - lmsize,zrf(1,1,0,ipan),lmsize2,czero,mrjvz(1,1,ipan),lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhli(1,1,0), & + lmsize,yif(1,1,0),lmsize2,czero,mihvy,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjli(1,1,0), & + lmsize,yif(1,1,0),lmsize2,czero,mijvy,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhli(1,1,0), & + lmsize,zif(1,1,0),lmsize2,czero,mihvz,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjli(1,1,0), & + lmsize,zif(1,1,0),lmsize2,czero,mijvz,lmsize) do icheb = 1,ncheb - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhlr(1,1,icheb), & - lmsize,yrf(1,1,icheb,ipan),lmsize2,cone,mrnvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjlr(1,1,icheb), & - lmsize,yrf(1,1,icheb,ipan),lmsize2,cone,mrjvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhlr(1,1,icheb), & - lmsize,zrf(1,1,icheb,ipan),lmsize2,cone,mrnvz(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjlr(1,1,icheb), & - lmsize,zrf(1,1,icheb,ipan),lmsize2,cone,mrjvz(1,1,ipan),lmsize) - end do -! if (idotime==1) call timing_pause('local3') - -end do !ipan -#ifdef CPP_hybrid -!$NOOMP END DO -!$NOOMP END PARALLEL -#endif -! end the big loop over the subintervals - - - -!if (idotime==1) call timing_stop('local') -!if (idotime==1) call timing_start('afterlocal') - -! *********************************************************************** -! calculate A(M), B(M), C(M), D(M) -! according to 5.17-5.18 (regular solution) of Bauer PhD -! C,D are calculated accordingly for the irregular solution -! (starting condition: A(0) = 1, B(0) = 0, C(MMAX) = 0 and D(MMAX) = 1) -! *********************************************************************** - -! regular -do lm2 = 1,lmsize - do lm1 = 1,lmsize - bllp(lm1,lm2,0) = czero - allp(lm1,lm2,0) = czero - end do -end do - -do lm1 = 1,lmsize - allp(lm1,lm1,0) = cone -end do - -do ipan = 1,npan - call zcopy(lmsize*lmsize,allp(1,1,ipan-1),1,allp(1,1,ipan),1) - call zcopy(lmsize*lmsize,bllp(1,1,ipan-1),1,bllp(1,1,ipan),1) - call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mrnvy(1,1,ipan), & - lmsize,allp(1,1,ipan-1),lmsize,cone,allp(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mrnvz(1,1,ipan), & - lmsize,bllp(1,1,ipan-1),lmsize,cone,allp(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize, cone,mrjvy(1,1,ipan), & - lmsize,allp(1,1,ipan-1),lmsize,cone,bllp(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize, cone,mrjvz(1,1,ipan), & - lMSIZE,BLLP(1,1,IPAN-1),LMSIZE,CONE,BLLP(1,1,IPAN),LMSIZE) -end do - -! *********************************************************************** -! determine the regular solution ull by using 5.14 -! *********************************************************************** -do ipan = 1,npan - do icheb = 0,ncheb - mn = ipan*ncheb + ipan - icheb - call zgemm('n','n',lmsize2,lmsize,lmsize,cone,yrf(1,1,icheb,ipan), & - lmsize2,allp(1,1,ipan-1),lmsize,czero,ull(1,1,mn),lmsize2) - call zgemm('n','n',lmsize2,lmsize,lmsize,cone,zrf(1,1,icheb,ipan), & - lmsize2,bllp(1,1,ipan-1),lmsize,cone,ull(1,1,mn),lmsize2) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhli(1,1,icheb), & + lmsize,yif(1,1,icheb),lmsize2,cone,mihvy,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjli(1,1,icheb), & + lmsize,yif(1,1,icheb),lmsize2,cone,mijvy,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhli(1,1,icheb), & + lmsize,zif(1,1,icheb),lmsize2,cone,mihvz,lmsize) + call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjli(1,1,icheb), & + lmsize,zif(1,1,icheb),lmsize2,cone,mijvz,lmsize) end do -end do - -!if (idotime==1) call timing_stop('afterlocal') -!if (idotime==1) call timing_start('endstuff') - -! *********************************************************************** -! next part converts the volterra solution u of equation (5.7) to -! the fredholm solution r by employing eq. 4.122 and 4.120 of bauer, phd -! and the t-matrix is calculated -! *********************************************************************** - -call zgetrf(lmsize,lmsize,allp(1,1,npan),lmsize,ipiv,info) !invert alpha -call zgetri(lmsize,allp(1,1,npan),lmsize,ipiv,work,lmsize*lmsize,info) !invert alpha -> transformation matrix rll=alpha^-1*rll -#ifdef hostcode -! get alpha matrix -! DO LM1=1,LMSIZE ! LLY -! DO LM2=1,LMSIZE ! LLY -! ALPHAGET(LM1,LM2)=ALLP(LM1,LM2,NPAN) ! LLY -! ENDDO ! LLY -! ENDDO ! LLY -#endif -! calculation of the t-matrix -call zgemm('n','n',lmsize,lmsize,lmsize,cone/gmatprefactor,bllp(1,1,npan), & ! calc t-matrix tll = bll*alpha^-1 - lmsize,allp(1,1,npan),lmsize,czero,tllp,lmsize) - -do nm = 1,nrmax -call zgemm('n','n',lmsize2,lmsize,lmsize,cone,ull(1,1,nm), & - lmsize2,allp(1,1,npan),lmsize,czero,rll(1,1,nm),lmsize2) -end do - -!if (idotime==1) call timing_stop('endstuff') -!if (idotime==1) call timing_start('checknan') -!if (idotime==1) call timing_stop('checknan') -!if (idotime==1) call timing_stop('local1') -!if (idotime==1) call timing_stop('local2') -!if (idotime==1) call timing_stop('local3') -!if (idotime==1) call timing_stop('rll') - -if ( use_sratrick==0 ) then - if(allocated(slv)) deallocate ( slv ) -elseif ( use_sratrick==1 ) then - if(allocated(work2)) deallocate ( work2, ipiv2 ) - if(allocated(slv1)) deallocate ( slv1 ) -! if(allocated(slv2)) deallocate ( slv2 ) - if(allocated(yrll1)) deallocate ( yrll1, zrll1 ) - if(allocated(yrll2)) deallocate ( yrll2, zrll2 ) -end if - -if(allocated(work)) deallocate( work ) -if(allocated(allp)) deallocate( allp, bllp ) -if(allocated(mrnvy)) deallocate( mrnvy, mrnvz ) -if(allocated(mrjvy)) deallocate( mrjvy, mrjvz ) -if(allocated(yrll)) deallocate( yrll, zrll ) -if(allocated(vjlr)) deallocate( vjlr, vhlr ) -if(allocated(vjlr_yrll1)) deallocate( vjlr_yrll1, vhlr_yrll1 ) -if(allocated(vjlr_zrll1)) deallocate( vjlr_zrll1, vhlr_zrll1 ) -if(allocated(yrll1temp)) deallocate( yrll1temp, zrll1temp ) - -if(allocated(yrf)) deallocate( yrf ) -if(allocated(zrf)) deallocate( zrf ) - -end subroutine - -#ifndef hostcode -END MODULE MOD_RLL_ONLY -#endif - -#define hostcode ! comment this out to use the impurity code interface -! choose between interface for impurity and host code (different calling lists) -#ifndef hostcode - MODULE MOD_RLLSLL - CONTAINS - SUBROUTINE RLLSLL(RPANBOUND,RMESH,VLL,RLL,SLL,TLLP, & - NCHEB,NPAN,LMSIZE,LMSIZE2,NRMAX, & - nvec,jlk_index,hlk,jlk,hlk2,jlk2,GMATPREFACTOR, & - cmoderll,cmodesll,cmodetest,idotime) -#else - SUBROUTINE RLLSLL(RPANBOUND,RMESH,VLL,RLL,SLL,TLLP, & - NCHEB,NPAN,LMSIZE,LMSIZE2,LBESSEL,NRMAX, & - NVEC,JLK_INDEX,HLK,JLK,HLK2,JLK2,GMATPREFACTOR, & - CMODERLL,CMODESLL,USE_SRATRICK1) ! & - ! ALPHAGET) ! LLY -#endif -! ************************************************************************ -! radial wave functions by the integral equation method of -! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) -! which has been extended for KKR using non-sperical potentials. -! Further information can be found in -! -! David Bauer, -! "Development of a relativistic full-potential first-principles multiple scattering -! Green function method applied to complex magnetic textures of nano structures -! at surfaces", PhD Thesis, 2014 -! -! http://darwin.bth.rwth-aachen.de/opus3/volltexte/2014/4925/ -! -! -! -! ************************************************************************ -! This routine solves the following two equations: -! -! ULL(r) = J(r) - PRE * J(r) * int_0^r( dr' r'^2 H2(r') * op(V(r')) * ULL(r') ) -! + PRE * H(r) * int_0^r( dr' r'^2 J2(r') * op(V(r')) * ULL(r') ) -! -! SLL(r) = H(r) - PRE * H(r) * int_0^r( dr' r'^2 H2(r') * op(V(r')) * RLL(r') ) -! + PRE * J(r) * int_0^r( dr' r'^2 H2(r') * op(V(r')) * SLL(r') ) -! -! where the integral int_0^r() runs from 0 to r -! ************************************************************************ -! Potential matrix : VLL(LMSIZE*NVEC,LMSIZE*NVEC) -! LMSIZE = LMMAX (number of LM components) x Number of spin components -! LMSIZE2 = NVEC* LMSIZE -! NVEC is 2 for a spinor and 1 in case of a non-rel. calculation -! -! ************************************************************************ -! Green function prefacor PRE=GMATPREFACTOR (scalar value) -! tipically \kappa for non-relativistic and M_0 \kappa for SRA -! -! ************************************************************************ - - -! ************************************************************************ -! The discretization of the Lippmann-Schwinger equation results in a matrix -! equation which is solved in this routine. Further information is given -! in section 5.2.3, page 90 of Bauer, PhD -! -! Source terms : -! right solution: J, H (nvec*lmsize,lmsize) or (lmsize,nvec*lmsize) -! left solution: J2,H2 (lmsize,nvec*lmsize) or (nvec*lmsize,lmsize) -! -! Example: -! The source term J is for LMSIZE=3 and NVEC=2 given by: -! J = / jlk(jlk_index(1)) \ -! | 0 jlk(jlk_index(2)) | -! | 0 0 jlk(jlk_index(3)) | -! | jlk(jlk_index(4)) | -! | 0 jlk(jlk_index(5)) | -! \ 0 0 jlk(jlk_index(6)) / -! -! first 3 rows are for the large and the last 3 rows for the small component -! ************************************************************************ -! Operator op() can be chosen to be a unity or a transpose operation -! The unity operation is used to calculate the right solution -! The transpose operation is used to calculate the left solution -! ************************************************************************ -! RMESH - radial mesh -! RPANBOUND - panel bounds RPANBOUND(0) left panel border of panel 1 -! RPANBOUND(1) right panel border of panel 1 -! NCHEB - highes chebyshev polynomial -! number of points per panel = NCHEB + 1 -! NPAN - number of panels -! LMSIZE - number of colums for the source matrix J etc... -! LMSIZE2 - number of rows for the source matrix J etc... -! NRMAX - total number of radial points (NPAN*(NCHEB+1)) -! NVEC - number of LMSIZE*LMSIZE blocks in J (LMSIZE2=NVEC*LMSIZE) -! ************************************************************************ -#ifndef hostcode -use mod_beshank ! calculates bessel and hankel func. -use mod_chebint ! chebyshev integration routines -use mod_config, only: config_testflag ! reads if testflags are present -use mod_physic_params,only: cvlight ! speed of light -use sourceterms -use mod_chebyshev -#endif -!use mod_timing ! timing routine -#ifdef CPP_hybrid -!use omp_lib ! omp functions -#endif -implicit none - integer :: ncheb ! number of chebyshev nodes - integer :: npan ! number of panels - integer :: lmsize ! lm-components * nspin - integer :: lmsize2 ! lmsize * nvec - integer :: nvec ! spinor integer - ! nvec=1 non-rel, nvec=2 for sra and dirac - integer :: nrmax ! total number of rad. mesh points -#ifdef hostcode - integer :: LBESSEL, use_sratrick1 ! dimensions etc., needed only for host code interface -#endif - - double complex,parameter:: ci= (0.0d0,1.0d0), &! complex i - cone=(1.0d0,0.0d0),&! 1 - czero=(0.0d0,0.0d0) ! 0 - ! running indices - integer ivec, ivec2 - integer l1,l2,lm1,lm2,lm3 - integer info,icheb2,icheb,ipan,mn,nm,nplm - - ! source terms - double complex :: gmatprefactor ! prefactor of green function - ! non-rel: = kappa = sqrt e -#ifndef hostcode - double complex :: hlk(:,:), jlk(:,:), & ! right sol. source terms - hlk2(:,:), jlk2(:,:) ! left sol. source terms - ! (tipically bessel and hankel fn) -#else - DOUBLE COMPLEX :: HLK(LBESSEL,NRMAX), & - JLK(LBESSEL,NRMAX), & - HLK2(LBESSEL,NRMAX), & - JLK2(LBESSEL,NRMAX) -#endif - -#ifndef hostcode - integer jlk_index(:) ! mapping array l = jlk_index(lm) - ! in: lm-index - ! corresponding l-index used hlk,.. - ! hlk(l) = jlk_index(lm) -#else - INTEGER JLK_INDEX(2*LMSIZE) -#endif - - character(len=1) :: cmoderll,cmodesll,cmodetest ! These define the op(V(r)) in the eqs. above - ! (comment in the beginning of this subroutine) - ! cmoderll ="1" : op( )=identity for reg. solution - ! cmoderll ="T" : op( )=transpose in L for reg. solution - ! cmodesll: same for irregular - double complex :: sll(lmsize2,lmsize,nrmax), & ! irr. volterra sol. - rll(lmsize2,lmsize,nrmax), & ! reg. fredholm sol. - tllp(lmsize,lmsize), & ! t-matrix - vll(lmsize*nvec,lmsize*nvec,nrmax) ! potential term in 5.7 - ! bauer, phd - double complex,allocatable :: ull(:,:,:) ! reg. volterra sol. +end subroutine sll_local_solutions - double complex,allocatable :: & - work(:,:), & - work2(:,:), & - allp(:,:,:),bllp(:,:,:), & ! eq. 5.9, 5.10 for reg. sol - cllp(:,:,:),dllp(:,:,:), & ! same for the irr. sol - slv(:,:,:,:),srv(:,:,:,:), & ! a in eq 5.68 - slv1(:,:,:,:),srv1(:,:,:,:), & !**************** -! slv2(:,:,:,:),srv2(:,:,:,:), & ! used for sra trick - mrnvy(:,:,:),mrnvz(:,:,:), & ! *************** - mrjvy(:,:,:),mrjvz(:,:,:), & ! eq. 5.19-5.22 - mihvy(:,:,:),mihvz(:,:,:), & ! - mijvy(:,:,:),mijvz(:,:,:), & ! *************** - yill(:,:,:),zill(:,:,:), & ! source terms (i:irreg., r: regular) - yrll(:,:,:),zrll(:,:,:), & ! - yill1(:,:,:),zill1(:,:,:), & ! source terms in case of sratrick - yrll1(:,:,:),zrll1(:,:,:), & - yill2(:,:,:),zill2(:,:,:), & - yrll2(:,:,:),zrll2(:,:,:), & - vhlr(:,:,:), & ! vhlr = h * v (regular sol.) - vjlr(:,:,:), & ! vjlr = j * v (regular sol.) - vhli(:,:,:), & ! vhli = h * v (irregular sol.) - vjli(:,:,:) ! vjli = j * v (irregular sol.) - double complex,allocatable :: & - vhlr_yrll1(:,:), & ! - vhlr_zrll1(:,:), & ! - vjlr_yrll1(:,:), & ! - vjlr_zrll1(:,:), & ! - yrll1temp(:,:), & ! - zrll1temp(:,:), & ! - yill1temp(:,:), & ! - zill1temp(:,:), & ! - vhli_yill1(:,:), & ! - vhli_zill1(:,:), & ! - vjli_yill1(:,:), & ! - vjli_zill1(:,:) - double complex,allocatable :: yif(:,:,:,:), & ! source terms (different array - yrf(:,:,:,:), & ! ordering) - zif(:,:,:,:), & - zrf(:,:,:,:) - ! chebyshev arrays - double complex zslc1sum(0:ncheb) - double precision c1(0:ncheb,0:ncheb),rpanbound(0:npan) - double precision cslc1(0:ncheb,0:ncheb), & ! Integration matrix from left ( C*S_L*C^-1 in eq. 5.53) - csrc1(0:ncheb,0:ncheb), & ! Same from right ( C*S_R*C^-1 in eq. 5.54) - tau(0:ncheb,0:npan), & ! Radial mesh point - slc1sum(0:ncheb),rmesh(nrmax),taucslcr,taucsrcr - integer ipiv(0:ncheb,lmsize2) - integer,allocatable :: ipiv2(:) -! logical test -! integer :: ierror - integer :: use_sratrick -! integer :: idotime - integer,parameter :: directsolv=1 -#ifdef hostcode -! DOUBLE COMPLEX ALPHAGET(LMSIZE,LMSIZE) ! LLY -#endif +SUBROUTINE drvbastrans(rc,crel,rrel,srrel,nrrel,irrel, & + nlmax,nkmmax,nmuemax,nkmpmax,nkmax,linmax) +! ******************************************************************** +! * * +! * * +! ******************************************************************** +IMPLICIT REAL*8(a-h,o-z) -#ifdef CPP_hybrid -! openMP variable --sacin 23/04/2015 -! integer :: thread_id, number_of_openmp_threads,number_of_processor -#endif +COMPLEX*16, INTENT(IN OUT) :: rc(nkmmax,nkmmax) +COMPLEX*16, INTENT(IN OUT) :: crel(nkmmax,nkmmax) +COMPLEX*16, INTENT(IN OUT) :: rrel(nkmmax,nkmmax) +COMPLEX*16, INTENT(IN OUT) :: srrel(2,2,nkmmax) +INTEGER, INTENT(IN OUT) :: nrrel(2,nkmmax) +INTEGER, INTENT(IN OUT) :: irrel(2,2,nkmmax) +INTEGER, INTENT(IN) :: nlmax +INTEGER, INTENT(IN) :: nkmmax +INTEGER, INTENT(IN) :: nmuemax +INTEGER, INTENT(IN) :: nkmpmax +INTEGER, INTENT(IN) :: nkmax +INTEGER, INTENT(IN) :: linmax - external zgetrf,zgetrs - intrinsic abs,atan,cos,dimag,exp,max,min,sin,sqrt +!*** Start of declarations rewritten by SPAG -! *********************************************************************** -! SRA trick -! *********************************************************************** -! on page 68 of Bauer, PhD, a method is described how to speed up the -! calculations in case of the SRA. A similar approach is implemented -! here by using Eq. 4.132 and substituting DV from 4.133, and discretising -! the radial mesh of the Lippmann-Schwinger eq. according to 5.68. -! The Lippmann-Schwinger equation leads to a matrix inversion -! problem. The matrix M which needs to be inverted has a special form -! if the SRA approximation is used: -! -! matrix A ( C 0) (same as in eq. 5.68) -! ( B 1) -! (C, B are matricies here) -! -! inverse of A is (C^-1 0 ) -! (-B C^-1 1 ) -! Thus, it is sufficient to only inverse the matrix C which saves computational -! time. This is refered to as the SRA trick. -! *********************************************************************** -! in future implementation equation 4.134 is supposed to be -! implemented which should lead to an additional speed-up. -! *********************************************************************** +! Local variables -#ifndef hostcode -if ( config_testflag('nosph') .or. lmsize==1 ) then - use_sratrick=0 -elseif ( .not. config_testflag('nosph') ) then - use_sratrick=1 -else - stop '[rllsll] use_sratrick error' -end if -#else -if ( lmsize==1 ) then - use_sratrick=0 -else - use_sratrick=use_sratrick1 -end if -#endif +REAL*8 cgc(nkmpmax,2) +INTEGER :: i,ikm1lin(linmax),ikm2lin(linmax),il,imue,iprint, & + kaptab(nmuemax),ltab(nmuemax),mmax,nmuetab(nmuemax), nsollm(nlmax,nmuemax) + +!*** End of declarations rewritten by SPAG + +IF (nkmmax /= 2*nlmax**2) STOP ' Check NLMAX,NKMMAX in < DRVBASTRANS > ' +IF (nmuemax /= 2*nlmax) STOP ' Check NLMAX,NMUEMAX in < DRVBASTRANS > ' +IF (nkmpmax /= (nkmmax+2*nlmax)) & + STOP ' Check NLMAX,NKMMAX,NKMPMAX in < DRVBASTRANS > ' +IF (nkmax /= 2*nlmax-1) STOP ' Check NLMAX,NKMAX in < DRVBASTRANS > ' +IF (linmax /= (2*nlmax*(2*nlmax-1))) & + STOP ' Check NLMAX,LINMAX in < DRVBASTRANS > ' -!#ifdef hostcode -!! turn timing output off if in the host code -!idotime = 0 -!#endif -!if (idotime==1) call timing_start('rllsll') +iprint = 0 +DO i = 1,nmuemax + ltab(i) = i/2 + IF ( 2*ltab(i) == i ) THEN + kaptab(i) = ltab(i) + ELSE + kaptab(i) = -ltab(i) - 1 + END IF + nmuetab(i) = 2*ABS(kaptab(i)) +END DO -do ipan = 1,npan - do icheb = 0,ncheb - mn = ipan*ncheb + ipan - icheb - tau(icheb,ipan) = rmesh(mn) - end do -end do +DO il = 1,nlmax + mmax = 2*il + DO imue = 1,mmax + IF ( (imue == 1) .OR. (imue == mmax) ) THEN + nsollm(il,imue) = 1 + ELSE + nsollm(il,imue) = 2 + END IF + END DO +END DO -call chebint(cslc1,csrc1,slc1sum,c1,ncheb) +CALL ikmlin(iprint,nsollm,ikm1lin,ikm2lin,nlmax,nmuemax,linmax, nlmax) +CALL calccgc(ltab,kaptab,nmuetab,cgc,nkmax,nmuemax,nkmpmax) +! ---------------------------- now calculate the transformation matrices -if(.not.allocated(ull)) allocate ( ull(lmsize2,lmsize,nrmax) ) +CALL strsmat(nlmax-1,cgc,srrel,nrrel,irrel,nkmmax,nkmpmax) -if ( use_sratrick==0 ) then - if(.not.allocated(slv)) allocate ( slv(0:ncheb,lmsize2,0:ncheb,lmsize2),srv(0:ncheb,lmsize2,0:ncheb,lmsize2) ) -elseif ( use_sratrick==1 ) then - if(.not.allocated(work2)) allocate ( work2((ncheb+1)*lmsize,(ncheb+1)*lmsize), ipiv2((ncheb+1)*lmsize) ) - if(.not.allocated(slv1)) allocate ( slv1(0:ncheb,lmsize,0:ncheb,lmsize), srv1(0:ncheb,lmsize,0:ncheb,lmsize) ) -! if(.not.allocated(slv2)) allocate ( slv2(0:ncheb,lmsize,0:ncheb,lmsize), srv2(0:ncheb,lmsize,0:ncheb,lmsize) ) - if(.not.allocated(yill1)) allocate ( yill1(0:ncheb,lmsize,lmsize), zill1(0:ncheb,lmsize,lmsize) ) - if(.not.allocated(yrll1)) allocate ( yrll1(0:ncheb,lmsize,lmsize), zrll1(0:ncheb,lmsize,lmsize) ) - if(.not.allocated(yill2)) allocate ( yill2(0:ncheb,lmsize,lmsize), zill2(0:ncheb,lmsize,lmsize) ) - if(.not.allocated(yrll2)) allocate ( yrll2(0:ncheb,lmsize,lmsize), zrll2(0:ncheb,lmsize,lmsize) ) -else - stop '[rllsll] error with testflag sph' -end if +CALL bastrmat(nlmax-1,cgc,rc,crel,rrel,nkmmax,nkmpmax) -if(.not.allocated(work)) allocate( work(lmsize,lmsize) ) -if(.not.allocated(allp)) allocate( allp(lmsize,lmsize,0:npan), bllp(lmsize,lmsize,0:npan) ) -if(.not.allocated(cllp)) allocate( cllp(lmsize,lmsize,0:npan), dllp(lmsize,lmsize,0:npan) ) -if(.not.allocated(mrnvy)) allocate( mrnvy(lmsize,lmsize,npan), mrnvz(lmsize,lmsize,npan) ) -if(.not.allocated(mrjvy)) allocate( mrjvy(lmsize,lmsize,npan), mrjvz(lmsize,lmsize,npan) ) -if(.not.allocated(mihvy)) allocate( mihvy(lmsize,lmsize,npan), mihvz(lmsize,lmsize,npan) ) -if(.not.allocated(mijvy)) allocate( mijvy(lmsize,lmsize,npan), mijvz(lmsize,lmsize,npan) ) -if(.not.allocated(yill)) allocate( yill(0:ncheb,lmsize2,lmsize), zill(0:ncheb,lmsize2,lmsize) ) -if(.not.allocated(yrll)) allocate( yrll(0:ncheb,lmsize2,lmsize), zrll(0:ncheb,lmsize2,lmsize) ) -if(.not.allocated(vjlr)) allocate( vjlr(lmsize,lmsize2,0:ncheb), vhlr(lmsize,lmsize2,0:ncheb) ) -if(.not.allocated(vjli)) allocate( vjli(lmsize,lmsize2,0:ncheb), vhli(lmsize,lmsize2,0:ncheb) ) -if(.not.allocated(vjlr_yrll1)) allocate( vjlr_yrll1(lmsize,lmsize), vhlr_yrll1(lmsize,lmsize) ) -if(.not.allocated(vjlr_zrll1)) allocate( vjlr_zrll1(lmsize,lmsize), vhlr_zrll1(lmsize,lmsize) ) -if(.not.allocated(yrll1temp)) allocate( yrll1temp(lmsize,lmsize), zrll1temp(lmsize,lmsize) ) -if(.not.allocated(vjli_yill1)) allocate( vjli_yill1(lmsize,lmsize), vhli_yill1(lmsize,lmsize) ) -if(.not.allocated(vjli_zill1)) allocate( vjli_zill1(lmsize,lmsize), vhli_zill1(lmsize,lmsize) ) -if(.not.allocated(yill1temp)) allocate( yill1temp(lmsize,lmsize), zill1temp(lmsize,lmsize) ) - -yrll=(0.0d0,0.0d0) -zill=(0.0d0,0.0d0) -yrll=(0.0d0,0.0d0) -zill=(0.0d0,0.0d0) +RETURN +END SUBROUTINE drvbastrans -if(.not.allocated(yif)) allocate( yif(lmsize2,lmsize,0:ncheb,npan) ) -if(.not.allocated(yrf)) allocate( yrf(lmsize2,lmsize,0:ncheb,npan) ) -if(.not.allocated(zif)) allocate( zif(lmsize2,lmsize,0:ncheb,npan) ) -if(.not.allocated(zrf)) allocate( zrf(lmsize2,lmsize,0:ncheb,npan) ) +SUBROUTINE changerep(a,mode,b,n,m,rc,crel,rrel,text,ltext) +! ******************************************************************** +! * * +! * change the representation of matrix A and store in B * +! * according to MODE: * +! * * +! * RLM>REL non-relat. REAL spher. harm. > (kappa,mue) * +! * REL>RLM (kappa,mue) > non-relat. REAL spher. harm. * +! * CLM>REL non-relat. CMPLX. spher. harm. > (kappa,mue) * +! * REL>CLM (kappa,mue) > non-relat. CMPLX. spher. harm. * +! * RLM>CLM non-relat. REAL spher. harm. > CMPLX. spher. harm. * +! * CLM>RLM non-relat. CMPLX. spher. harm. > REAL spher. harm. * +! * * +! * the non-relat. representations include the spin index * +! * * +! * for LTEXT > 0 the new matrix B is printed * +! * * +! ******************************************************************** +IMPLICIT REAL*8(a-h,o-z) +COMPLEX*16, INTENT(IN OUT) :: a(m,m) +CHARACTER (LEN=7), INTENT(IN) :: mode +COMPLEX*16, INTENT(IN OUT) :: b(m,m) +INTEGER, INTENT(IN OUT) :: n +INTEGER, INTENT(IN OUT) :: m +COMPLEX*16, INTENT(IN OUT) :: rc(m,m) +COMPLEX*16, INTENT(IN OUT) :: crel(m,m) +COMPLEX*16, INTENT(IN OUT) :: rrel(m,m) +CHARACTER (LEN=*), INTENT(IN) :: text +INTEGER, INTENT(IN) :: ltext -#ifdef CPP_hybrid -!call omp_set_num_threads(16) -!number_of_openmp_threads = omp_get_num_threads() -!write(*,*) 'number_of_openmp_threads: ', number_of_openmp_threads -!$NOOMP PARALLEL DEFAULT (PRIVATE) & -!$NOOMP& SHARED(tau,npan,rpanbound,mrnvy,mrnvz,mrjvy,mrjvz,mihvy,mihvz,mijvy,mijvz,yif,yrf, & -!$NOOMP& zif,zrf,nvec,lmsize,lmsize2,ncheb,jlk,jlk2,jlk_index,vll,gmatprefactor,hlk,hlk2,cslc1,csrc1,slc1sum, & -!$NOOMP& cmoderll,cmodesll,cmodetest,use_sratrick, rmesh) +!*** Start of declarations rewritten by SPAG -!thread_id = omp_get_thread_num() -#endif +! PARAMETER definitions -if(.not.allocated(ull)) allocate ( ull(lmsize2,lmsize,nrmax) ) +COMPLEX*16, PARAMETER :: c1=(1.0D0,0.0D0) +COMPLEX*16, PARAMETER :: c0=(0.0D0,0.0D0) -if ( use_sratrick==0 ) then - if(.not.allocated(slv)) allocate ( slv(0:ncheb,lmsize2,0:ncheb,lmsize2),srv(0:ncheb,lmsize2,0:ncheb,lmsize2) ) -elseif ( use_sratrick==1 ) then - if(.not.allocated(work2)) allocate ( work2((ncheb+1)*lmsize,(ncheb+1)*lmsize), ipiv2((ncheb+1)*lmsize) ) - if(.not.allocated(slv1)) allocate ( slv1(0:ncheb,lmsize,0:ncheb,lmsize), srv1(0:ncheb,lmsize,0:ncheb,lmsize) ) -! if(.not.allocated(slv2)) allocate ( slv2(0:ncheb,lmsize,0:ncheb,lmsize), srv2(0:ncheb,lmsize,0:ncheb,lmsize) ) - if(.not.allocated(yill1)) allocate ( yill1(0:ncheb,lmsize,lmsize), zill1(0:ncheb,lmsize,lmsize) ) - if(.not.allocated(yrll1)) allocate ( yrll1(0:ncheb,lmsize,lmsize), zrll1(0:ncheb,lmsize,lmsize) ) - if(.not.allocated(yill2)) allocate ( yill2(0:ncheb,lmsize,lmsize), zill2(0:ncheb,lmsize,lmsize) ) - if(.not.allocated(yrll2)) allocate ( yrll2(0:ncheb,lmsize,lmsize), zrll2(0:ncheb,lmsize,lmsize) ) -else - stop '[rllsll] error with testflag sph' -end if +! Dummy arguments -if(.not.allocated(work)) allocate( work(lmsize,lmsize) ) -if(.not.allocated(allp)) allocate( allp(lmsize,lmsize,0:npan), bllp(lmsize,lmsize,0:npan) ) -if(.not.allocated(cllp)) allocate( cllp(lmsize,lmsize,0:npan), dllp(lmsize,lmsize,0:npan) ) -if(.not.allocated(mrnvy)) allocate( mrnvy(lmsize,lmsize,npan), mrnvz(lmsize,lmsize,npan) ) -if(.not.allocated(mrjvy)) allocate( mrjvy(lmsize,lmsize,npan), mrjvz(lmsize,lmsize,npan) ) -if(.not.allocated(mihvy)) allocate( mihvy(lmsize,lmsize,npan), mihvz(lmsize,lmsize,npan) ) -if(.not.allocated(mijvy)) allocate( mijvy(lmsize,lmsize,npan), mijvz(lmsize,lmsize,npan) ) -if(.not.allocated(yill)) allocate( yill(0:ncheb,lmsize2,lmsize), zill(0:ncheb,lmsize2,lmsize) ) -if(.not.allocated(yrll)) allocate( yrll(0:ncheb,lmsize2,lmsize), zrll(0:ncheb,lmsize2,lmsize) ) -if(.not.allocated(vjlr)) allocate( vjlr(lmsize,lmsize2,0:ncheb), vhlr(lmsize,lmsize2,0:ncheb) ) -if(.not.allocated(vjli)) allocate( vjli(lmsize,lmsize2,0:ncheb), vhli(lmsize,lmsize2,0:ncheb) ) -yrll=(0.0d0,0.0d0) -zill=(0.0d0,0.0d0) -yrll=(0.0d0,0.0d0) -zill=(0.0d0,0.0d0) -if(.not.allocated(yif)) allocate( yif(lmsize2,lmsize,0:ncheb,npan) ) -if(.not.allocated(yrf)) allocate( yrf(lmsize2,lmsize,0:ncheb,npan) ) -if(.not.allocated(zif)) allocate( zif(lmsize2,lmsize,0:ncheb,npan) ) -if(.not.allocated(zrf)) allocate( zrf(lmsize2,lmsize,0:ncheb,npan) ) -!if (idotime==1) call timing_start('local') -! loop over subintervals -#ifdef CPP_hybrid -! openMP pragmas added sachin, parallel region starts earlier to get allocations of arrays right -!$NOOMP DO -#endif -do ipan = 1,npan -! if (idotime==1) call timing_start('local1') +! Local variables - ! initialization - - vhlr=czero - vjlr=czero - vhli=czero - vjli=czero +INTEGER :: key +COMPLEX*16 w1(m,m) - if (use_sratrick==0) then +!*** End of declarations rewritten by SPAG - yrll=czero - zrll=czero - yill=czero - zill=czero - else - yrll1=czero - zrll1=czero - yill1=czero - zill1=czero - yrll2=czero - zrll2=czero - yill2=czero - zill2=czero - end if +!---------------------- transform MAT from (kappa,mue) to REAL (l,ml,ms) +IF ( mode == 'REL>RLM' ) THEN + CALL zgemm('N','N',n,n,n,c1,rrel,m,a,m,c0,w1,m) + CALL zgemm('N','C',n,n,n,c1,w1,m,rrel,m,c0,b,m) + key = 2 +ELSE IF ( mode == 'RLM>REL' ) THEN + CALL zgemm('C','N',n,n,n,c1,rrel,m,a,m,c0,w1,m) + CALL zgemm('N','N',n,n,n,c1,w1,m,rrel,m,c0,b,m) + key = 3 +ELSE IF ( mode == 'REL>CLM' ) THEN + CALL zgemm('N','N',n,n,n,c1,crel,m,a,m,c0,w1,m) + CALL zgemm('N','C',n,n,n,c1,w1,m,crel,m,c0,b,m) + key = 2 +ELSE IF ( mode == 'CLM>REL' ) THEN + CALL zgemm('C','N',n,n,n,c1,crel,m,a,m,c0,w1,m) + CALL zgemm('N','N',n,n,n,c1,w1,m,crel,m,c0,b,m) + key = 3 +ELSE IF ( mode == 'CLM>RLM' ) THEN + CALL zgemm('N','N',n,n,n,c1,rc,m,a,m,c0,w1,m) + CALL zgemm('N','C',n,n,n,c1,w1,m,rc,m,c0,b,m) + key = 2 +ELSE IF ( mode == 'RLM>CLM' ) THEN + CALL zgemm('C','N',n,n,n,c1,rc,m,a,m,c0,w1,m) + CALL zgemm('N','N',n,n,n,c1,w1,m,rc,m,c0,b,m) + key = 2 +ELSE + WRITE (*,*) ' MODE = ',mode + STOP 'in <ROTATE> MODE not allowed' +END IF -!--------------------------------------------------------------------- -! 1. prepare VJLR, VNL, VHLR, which appear in the integrands -! TAU(K,IPAN) is used instead of TAU(K,IPAN)**2, which directly gives -! RLL(r) and SLL(r) multiplied with r. TAU is the radial mesh. -! -! 2. prepare the source terms YR, ZR, YI, ZI -! because of the conventions used by -! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) -! a factor sqrt(E) is included in the source terms -! this factor is removed by the definition of ZSLC1SUM given below -! -!vjlr = \kappa * J * V = \kappa * r * j *V -!vhlr = \kappa * H * V = \kappa * r * h *V -! -! i.e. prepare terms kappa*J*DV, kappa*H*DV appearing in 5.11, 5.12. +IF ( ltext > 0 ) CALL cmatstr(text,ltext,b,n,m,key,key,0,1D-8,6) +! IF ( LTEXT.GT.0 ) CALL CMATSTR(TEXT,LTEXT,B,N,M,KEY,KEY,0,1D-12,6) +END SUBROUTINE changerep - do icheb = 0,ncheb - mn = ipan*ncheb + ipan - icheb - if (cmoderll=='1') then - do ivec2=1,nvec - do lm2 = 1,lmsize - do ivec=1,nvec - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(ivec-1) ) - vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*jlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) - vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*hlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) - end do - end do - end do - end do - elseif (cmoderll=='T') then ! transposed matrix (might not be needed anymore) - do ivec2=1,nvec - do lm2 = 1,lmsize - do ivec=1,nvec - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(ivec-1) ) - vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vjlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*jlk2(l1,mn)*vll(lm2+lmsize*(ivec-1),lm1+lmsize*(ivec2-1),mn) - vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) = vhlr(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*hlk2(l1,mn)*vll(lm2+lmsize*(ivec-1),lm1+lmsize*(ivec2-1),mn) - end do - end do - end do - end do !nvec - elseif (cmoderll=='0') then ! as a test option - vjlr(:,:,icheb) = czero - vhlr(:,:,icheb) = czero - else - stop '[rllsll] mode not known' - end if +SUBROUTINE bastrmat(lmax,cgc,rc,crel,rrel,nkmmax,nkmpmax) +! ******************************************************************** +! * * +! * INITIALIZE TRANSFORMATION MATRIX THAT TAKES MATRICES FROM * +! * RELATIVISTIC TO REAL SPERICAL HARM. REPRESENTATION * +! * * +! * this is a special version of <STRSMAT> passing the * +! * full BASis TRansformation MATrices RC, CREL and RREL * +! * * +! * 13/01/98 HE * +! ******************************************************************** - if (cmodesll=='1') then - do ivec2=1,nvec - do lm2 = 1,lmsize - do ivec=1,nvec - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(ivec-1) ) - vjli(lm1,lm2+lmsize*(ivec2-1),icheb) = vjli(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*jlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) - vhli(lm1,lm2+lmsize*(ivec2-1),icheb) = vhli(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*hlk2(l1,mn)*vll(lm1+lmsize*(ivec-1),lm2+lmsize*(ivec2-1),mn) - end do - end do - end do - end do !nvec - elseif (cmodesll=='T') then - do ivec2=1,nvec - do lm2 = 1,lmsize - do ivec=1,nvec - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(ivec-1) ) - vjli(lm1,lm2+lmsize*(ivec2-1),icheb) = vjli(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*jlk2(l1,mn)*vll(lm2+lmsize*(ivec-1),lm1+lmsize*(ivec2-1),mn) - vhli(lm1,lm2+lmsize*(ivec2-1),icheb) = vhli(lm1,lm2+lmsize*(ivec2-1),icheb) + & - gmatprefactor*tau(icheb,ipan)*hlk2(l1,mn)*vll(lm2+lmsize*(ivec-1),lm1+lmsize*(ivec2-1),mn) - end do - end do - end do - end do !nvec - elseif (cmodesll=='0') then - vjli(:,:,icheb) = czero - vhli(:,:,icheb) = czero - else - stop '[rllsll] mode not known' - end if +IMPLICIT REAL*8(a-h,o-z) - ! calculation of the J (and H) matrix according to equation 5.69 (2nd eq.) - if ( use_sratrick==0 ) then - do ivec=1,nvec ! index for large/small component - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(ivec-1) ) - yrll(icheb,lm1+lmsize*(ivec-1),lm1) = tau(icheb,ipan)*jlk(l1,mn) - zrll(icheb,lm1+lmsize*(ivec-1),lm1) = tau(icheb,ipan)*hlk(l1,mn) - yill(icheb,lm1+lmsize*(ivec-1),lm1) = tau(icheb,ipan)*hlk(l1,mn) - zill(icheb,lm1+lmsize*(ivec-1),lm1) = tau(icheb,ipan)*jlk(l1,mn) - end do - end do !ivec=1,nvec - elseif ( use_sratrick==1 ) then - do lm1 = 1,lmsize - l1 = jlk_index( lm1+lmsize*(1-1) ) - l2 = jlk_index( lm1+lmsize*(2-1) ) - yrll1(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*jlk(l1,mn) - zrll1(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*hlk(l1,mn) - yill1(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*hlk(l1,mn) - zill1(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*jlk(l1,mn) - yrll2(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*jlk(l2,mn) - zrll2(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*hlk(l2,mn) - yill2(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*hlk(l2,mn) - zill2(icheb,lm1+lmsize*(1-1),lm1) = tau(icheb,ipan)*jlk(l2,mn) - end do - end if - end do ! icheb +INTEGER, INTENT(IN) :: lmax +REAL*8, INTENT(IN) :: cgc(nkmpmax,2) +COMPLEX*16, INTENT(OUT) :: rc(nkmmax,nkmmax) +COMPLEX*16, INTENT(OUT) :: crel(nkmmax,nkmmax) +COMPLEX*16, INTENT(IN OUT) :: rrel(nkmmax,nkmmax) +INTEGER, INTENT(IN) :: nkmmax +INTEGER, INTENT(IN) :: nkmpmax - ! calculation of A in 5.68 - if ( use_sratrick==0 ) then - do icheb2 = 0,ncheb - do icheb = 0,ncheb - taucslcr = tau(icheb,ipan)*cslc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 - taucsrcr = tau(icheb,ipan)*csrc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 - mn = ipan*ncheb + ipan - icheb - do lm2 = 1,lmsize2 - do ivec=1,nvec - do lm3 = 1,lmsize - lm1=lm3+(ivec-1)*lmsize - l1 = jlk_index(lm1) - slv(icheb,lm1,icheb2,lm2) = & - taucslcr*(jlk(l1,mn)*vhlr(lm3,lm2,icheb2) & - -hlk(l1,mn)*vjlr(lm3,lm2,icheb2)) - srv(icheb,lm1,icheb2,lm2) = & - taucsrcr*(-jlk(l1,mn)*vhli(lm3,lm2,icheb2) & - +hlk(l1,mn)*vjli(lm3,lm2,icheb2)) -! slv(icheb,lm1,icheb2,lm2) = & -! ( tau(icheb,ipan)*jlk(l1,mn)*cslc1(icheb,icheb2)*vhlr(lm3,lm2,icheb2) & -! -tau(icheb,ipan)*hlk(l1,mn)*cslc1(icheb,icheb2)*vjlr(lm3,lm2,icheb2))& -! *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 -! srv(icheb,lm1,icheb2,lm2) = & -! (-tau(icheb,ipan)*jlk(l1,mn)*csrc1(icheb,icheb2)*vhli(lm3,lm2,icheb2) & -! +tau(icheb,ipan)*hlk(l1,mn)*csrc1(icheb,icheb2)*vjli(lm3,lm2,icheb2)) & -! *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 - end do - end do - end do - end do - end do - do lm1 = 1,lmsize2 - do icheb = 0,ncheb - slv(icheb,lm1,icheb,lm1) = slv(icheb,lm1,icheb,lm1) + 1.d0 - srv(icheb,lm1,icheb,lm1) = srv(icheb,lm1,icheb,lm1) + 1.d0 - end do - end do - elseif ( use_sratrick==1 ) then - do icheb2 = 0,ncheb - do icheb = 0,ncheb - taucslcr = tau(icheb,ipan)*cslc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 - taucsrcr = tau(icheb,ipan)*csrc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 - mn = ipan*ncheb + ipan - icheb - do lm2 = 1,lmsize -! do ivec=1,1 - do lm3 = 1,lmsize -! lm1=lm3+(ivec-1)*lmsize - lm1=lm3 - l1 = jlk_index(lm1) +!*** Start of declarations rewritten by SPAG - ! this is the block to be inverted in SRAtrick. (named C in comment above): - slv1(icheb,lm1,icheb2,lm2) = & - taucslcr*(jlk(l1,mn)*vhlr(lm3,lm2,icheb2) & - -hlk(l1,mn)*vjlr(lm3,lm2,icheb2)) - srv1(icheb,lm1,icheb2,lm2) = & - taucsrcr*(-jlk(l1,mn)*vhli(lm3,lm2,icheb2) & - +hlk(l1,mn)*vjli(lm3,lm2,icheb2)) +! PARAMETER definitions - end do -! end do - end do - end do - end do -! do icheb2 = 0,ncheb -! do icheb = 0,ncheb -! taucslcr = tau(icheb,ipan)*cslc1(icheb,icheb2) & -! *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 -! taucsrcr = tau(icheb,ipan)*csrc1(icheb,icheb2) & -! *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 -! mn = ipan*ncheb + ipan - icheb -! do lm2 = 1,lmsize -! do ivec=2,2 -! do lm3 = 1,lmsize -! lm1=lm3+(ivec-1)*lmsize -! lm1=lm3+lmsize -! l1 = jlk_index(lm1) - -! slv2(icheb,lm3,icheb2,lm2) = & -! taucslcr*(jlk(l1,mn)*vhlr(lm3,lm2,icheb2) & -! -hlk(l1,mn)*vjlr(lm3,lm2,icheb2)) -! srv2(icheb,lm3,icheb2,lm2) = & -! taucsrcr*(-jlk(l1,mn)*vhli(lm3,lm2,icheb2) & -! +hlk(l1,mn)*vjli(lm3,lm2,icheb2)) - -! end do -! end do -! end do -! end do -! end do - do lm1 = 1,lmsize - do icheb = 0,ncheb - slv1(icheb,lm1,icheb,lm1) = slv1(icheb,lm1,icheb,lm1) + 1.d0 - srv1(icheb,lm1,icheb,lm1) = srv1(icheb,lm1,icheb,lm1) + 1.d0 - end do - end do +COMPLEX*16, PARAMETER :: ci=(0.0D0,1.0D0) +COMPLEX*16, PARAMETER :: c1=(1.0D0,0.0D0) +COMPLEX*16, PARAMETER :: c0=(0.0D0,0.0D0) - else - stop '[rllsll] error in inversion' - end if +! Local variables -! if (idotime==1) call timing_pause('local1') -! if (idotime==1) call timing_start('local2') +INTEGER :: i,ikm,j,jp05,k,l,lm,lnr,m,muem05,muep05,nk,nkm,nlm +REAL*8 w -!------------------------------------------------------- -! determine the local solutions -! solve the equations SLV*YRLL=S and SLV*ZRLL=C -! and SRV*YILL=C and SRV*ZILL=S -! i.e., solve system A*U=J, see eq. 5.68. +!*** End of declarations rewritten by SPAG - if ( use_sratrick==0 ) then - nplm = (ncheb+1)*lmsize2 +nk = 2*(lmax+1) + 1 +nlm = (lmax+1)**2 +nkm = 2*nlm +! =================================================== +! INDEXING: +! IKM = L*2*(J+1/2) + J + MUE + 1 +! LM = L*(L+1) + M + 1 +! =================================================== - if (cmoderll/='0') then -! if (idotime==1) call timing_start('inversion') - call zgetrf(nplm,nplm,slv,nplm,ipiv,info) -! if (idotime==1) call timing_stop('inversion','test') - if (info/=0) stop 'rllsll: zgetrf' - call zgetrs('n',nplm,lmsize,slv,nplm,ipiv,yrll,nplm,info) - call zgetrs('n',nplm,lmsize,slv,nplm,ipiv,zrll,nplm,info) - end if - if (cmodesll/='0') then -! if (directsolv==1) then - call zgetrf(nplm,nplm,srv,nplm,ipiv,info) - if (info/=0) stop 'rllsll: zgetrf' - call zgetrs('n',nplm,lmsize,srv,nplm,ipiv,yill,nplm,info) - call zgetrs('n',nplm,lmsize,srv,nplm,ipiv,zill,nplm,info) -! else -! call iterativesol (ncheb,lmsize2,lmsize,srv,yill) -! call iterativesol (ncheb,lmsize2,lmsize,srv,zill) -! end if - end if - elseif ( use_sratrick==1 ) then - nplm = (ncheb+1)*lmsize +! ---------------------------------------------------------------------- +! CREL transforms from COMPLEX (L,M,S) to (KAP,MUE) - representation +! |LAM> = sum[LC] |LC> * CREL(LC,LAM) +! ---------------------------------------------------------------------- +CALL cinit(nkmmax*nkmmax,crel) - call zgetrf(nplm,nplm,slv1,nplm,ipiv,info) - call zgetrs('n',nplm,lmsize,slv1,nplm,ipiv,yrll1,nplm,info) - call zgetrs('n',nplm,lmsize,slv1,nplm,ipiv,zrll1,nplm,info) +lm = 0 +DO lnr = 0,lmax + DO m = -lnr,lnr + lm = lm + 1 + + ikm = 0 + DO k = 1,nk + l = k/2 + IF ( 2*l == k ) THEN + jp05 = l + ELSE + jp05 = l + 1 + END IF + + DO muem05 = -jp05,(jp05-1) + muep05 = muem05 + 1 + ikm = ikm + 1 + + IF ( l == lnr ) THEN + IF ( muep05 == m ) crel(lm,ikm) = cgc(ikm,1) + IF ( muem05 == m ) crel(lm+nlm,ikm) = cgc(ikm,2) + END IF + + END DO + END DO + + END DO +END DO -! call zgemm('n','n',nplm,lmsize,nplm,-cone,slv2, & -! nplm,yrll1,nplm,cone,yrll2,nplm) +! ---------------------------------------------------------------------- +! RC transforms from REAL to COMPLEX (L,M,S) - representation +! |LC> = sum[LR] |LR> * RC(LR,LC) +! ---------------------------------------------------------------------- +CALL cinit(nkmmax*nkmmax,rc) -! call zgemm('n','n',nplm,lmsize,nplm,-cone,slv2, & -! nplm,zrll1,nplm,cone,zrll2,nplm) +w = 1.0D0/SQRT(2.0D0) - call zgetrf(nplm,nplm,srv1,nplm,ipiv,info) - call zgetrs('n',nplm,lmsize,srv1,nplm,ipiv,yill1,nplm,info) - call zgetrs('n',nplm,lmsize,srv1,nplm,ipiv,zill1,nplm,info) +DO l = 0,lmax + DO m = -l,l + i = l*(l+1) + m + 1 + j = l*(l+1) - m + 1 + + IF ( m < 0 ) THEN + rc(i,i) = -ci*w + rc(j,i) = w + rc(i+nlm,i+nlm) = -ci*w + rc(j+nlm,i+nlm) = w + END IF + IF ( m == 0 ) THEN + rc(i,i) = c1 + rc(i+nlm,i+nlm) = c1 + END IF + IF ( m > 0 ) THEN + rc(i,i) = w*(-1.0D0)**m + rc(j,i) = ci*w*(-1.0D0)**m + rc(i+nlm,i+nlm) = w*(-1.0D0)**m + rc(j+nlm,i+nlm) = ci*w*(-1.0D0)**m + END IF + END DO +END DO -! call zgemm('n','n',nplm,lmsize,nplm,-cone,srv2, & -! nplm,yill1,nplm,cone,yill2,nplm) +! ---------------------------------------------------------------------- +! RREL transforms from REAL (L,M,S) to (KAP,MUE) - representation +! |LAM> = sum[LR] |LR> * RREL(LR,LAM) +! ---------------------------------------------------------------------- -! call zgemm('n','n',nplm,lmsize,nplm,-cone,srv2, & -! nplm,zill1,nplm,cone,zill2,nplm) +CALL zgemm('N','N',nkm,nkm,nkm,c1,rc,nkmmax,crel,nkmmax,c0,rrel, nkmmax) - do icheb2 = 0,ncheb - do lm2 = 1,lmsize - do lm1 = 1,lmsize - yrll1temp(lm1,lm2) = yrll1(icheb2,lm1,lm2) - zrll1temp(lm1,lm2) = zrll1(icheb2,lm1,lm2) - yill1temp(lm1,lm2) = yill1(icheb2,lm1,lm2) - zill1temp(lm1,lm2) = zill1(icheb2,lm1,lm2) - end do - end do - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhlr(1,1,icheb2), & - lmsize,yrll1temp,lmsize,czero,vhlr_yrll1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhlr(1,1,icheb2), & - lmsize,zrll1temp,lmsize,czero,vhlr_zrll1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjlr(1,1,icheb2), & - lmsize,yrll1temp,lmsize,czero,vjlr_yrll1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjlr(1,1,icheb2), & - lmsize,zrll1temp,lmsize,czero,vjlr_zrll1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhli(1,1,icheb2), & - lmsize,yill1temp,lmsize,czero,vhli_yill1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vhli(1,1,icheb2), & - lmsize,zill1temp,lmsize,czero,vhli_zill1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjli(1,1,icheb2), & - lmsize,yill1temp,lmsize,czero,vjli_yill1,lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,cone,vjli(1,1,icheb2), & - lmsize,zill1temp,lmsize,czero,vjli_zill1,lmsize) +END SUBROUTINE bastrmat + +SUBROUTINE calccgc(ltab,kaptab,nmuetab,cgc,nkmax,nmuemax,nkmpmax) + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-01 Time: 12:05:10 + +! ******************************************************************** +! * * +! * CLEBSCH-GORDON-COEFFICIENTS CGC(IKM,IS) * +! * * +! * IKM NUMBERS CGC FOR INCREASING K AND MUE * +! * IKM = L*2*(J+1/2) + J + MUE + 1 * +! * IS= 1/2 SPIN DOWN/UP * +! * * +! ******************************************************************** - do icheb = 0,ncheb - taucslcr = - tau(icheb,ipan)*cslc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 ! *(b-a)/2 in eq. 5.53, 5.54 - taucsrcr = tau(icheb,ipan)*csrc1(icheb,icheb2) & - *(rpanbound(ipan)-rpanbound(ipan-1))/ 2.d0 - mn = ipan*ncheb + ipan - icheb - do lm2 = 1,lmsize - do lm3 = 1,lmsize - lm1=lm3+lmsize - l1 = jlk_index(lm1) +IMPLICIT NONE - yrll2(icheb,lm3,lm2) = & - yrll2(icheb,lm3,lm2) + & - taucslcr*(jlk(l1,mn)*vhlr_yrll1(lm3,lm2) & - -hlk(l1,mn)*vjlr_yrll1(lm3,lm2)) +INTEGER, INTENT(IN) :: ltab(nmuemax) +INTEGER, INTENT(IN) :: kaptab(nmuemax) +INTEGER, INTENT(IN) :: nmuetab(nmuemax) +REAL*8, INTENT(OUT) :: cgc(nkmpmax,2) +INTEGER, INTENT(IN) :: nkmax +INTEGER, INTENT(IN) :: nmuemax +INTEGER, INTENT(IN) :: nkmpmax - zrll2(icheb,lm3,lm2) = & - zrll2(icheb,lm3,lm2) + & - taucslcr*(jlk(l1,mn)*vhlr_zrll1(lm3,lm2) & - -hlk(l1,mn)*vjlr_zrll1(lm3,lm2)) - yill2(icheb,lm3,lm2) = & - yill2(icheb,lm3,lm2) + & - taucsrcr*(jlk(l1,mn)*vhli_yill1(lm3,lm2) & - -hlk(l1,mn)*vjli_yill1(lm3,lm2)) +! Local variables - zill2(icheb,lm3,lm2) = & - zill2(icheb,lm3,lm2) + & - taucsrcr*(jlk(l1,mn)*vhli_zill1(lm3,lm2) & - -hlk(l1,mn)*vjli_zill1(lm3,lm2)) +INTEGER :: ikm,k,kappa,m +REAL*8 j,l,mue,twolp1 - end do - end do - end do - end do +ikm = 0 +DO k = 1,(nkmax+1) + l = ltab(k) + kappa = kaptab(k) + j = ABS(kappa) - 0.5D0 + mue = -j - 1.0D0 + twolp1 = 2.0D0*l + 1.0D0 + + IF ( kappa < 0 ) THEN + +! J = L + 1/2 + DO m = 1,nmuetab(k) + + mue = mue + 1.0D0 + ikm = ikm + 1 + cgc(ikm,1) = DSQRT((l-mue+0.5D0)/twolp1) + cgc(ikm,2) = DSQRT((l+mue+0.5D0)/twolp1) + END DO + ELSE +! J = L - 1/2 + DO m = 1,nmuetab(k) + + mue = mue + 1.0D0 + ikm = ikm + 1 + cgc(ikm,1) = DSQRT((l+mue+0.5D0)/twolp1) + cgc(ikm,2) = -DSQRT((l-mue+0.5D0)/twolp1) + + END DO + END IF + + +END DO - else - stop '[rllsll] error in inversion' - end if +END SUBROUTINE calccgc - ! Reorient indices for later use - if ( use_sratrick==0 ) then - do icheb = 0,ncheb - do lm2 = 1,lmsize - do lm1 = 1,lmsize2 - yrf(lm1,lm2,icheb,ipan) = yrll(icheb,lm1,lm2) - zrf(lm1,lm2,icheb,ipan) = zrll(icheb,lm1,lm2) - yif(lm1,lm2,icheb,ipan) = yill(icheb,lm1,lm2) - zif(lm1,lm2,icheb,ipan) = zill(icheb,lm1,lm2) - end do - end do - end do +!*==cmatstr.f processed by SPAG 6.05Rc at 15:50 on 12 Oct 2002 + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-01 Time: 12:05:17 - elseif ( use_sratrick==1 ) then +SUBROUTINE cmatstr(str,lstr,a,n,m,mlin,mcol,ijq,tolp,k_fmt_fil) +! ******************************************************************** +! * * +! * writes structure of COMPLEX NxN matrix A * +! * * +! * M is the actual array - size used for A * +! * MLIN/COL MODE for line and column indexing * +! * 0: plain, 1: (l,ml), 2: (l,ml,ms), 3: (kap,mue) * +! * TOL tolerance for difference * +! * IJQ if IJQ > 1000 pick IQ-JQ-block matrix * +! * assuming IJQ = IQ*1000 + JQ * +! * else: no IQ-JQ-indexing * +! * K_FMT_FIL output channel * +! * a negative sign suppresses table at the end * +! * * +! * any changes should be done in RMATSTR as well !!!!!!!!!!!!!!! * +! * * +! ******************************************************************** - do icheb = 0,ncheb - do lm2 = 1,lmsize - do lm1 = 1,lmsize - yrf(lm1,lm2,icheb,ipan) = yrll1(icheb,lm1,lm2) - zrf(lm1,lm2,icheb,ipan) = zrll1(icheb,lm1,lm2) - yif(lm1,lm2,icheb,ipan) = yill1(icheb,lm1,lm2) - zif(lm1,lm2,icheb,ipan) = zill1(icheb,lm1,lm2) - end do - end do - end do +IMPLICIT COMPLEX*16(a-h,o-z) - do icheb = 0,ncheb - do lm2 = 1,lmsize - do lm1 = 1,lmsize - yrf(lm1+lmsize,lm2,icheb,ipan) = yrll2(icheb,lm1,lm2) - zrf(lm1+lmsize,lm2,icheb,ipan) = zrll2(icheb,lm1,lm2) - yif(lm1+lmsize,lm2,icheb,ipan) = yill2(icheb,lm1,lm2) - zif(lm1+lmsize,lm2,icheb,ipan) = zill2(icheb,lm1,lm2) - end do - end do - end do +CHARACTER (LEN=*), INTENT(IN) :: str +INTEGER, INTENT(IN) :: lstr +COMPLEX*16, INTENT(IN OUT) :: a(m,m) +INTEGER, INTENT(IN) :: n +INTEGER, INTENT(IN) :: m +INTEGER, INTENT(IN) :: mlin +INTEGER, INTENT(IN) :: mcol +INTEGER, INTENT(IN) :: ijq +REAL*8, INTENT(IN) :: tolp +INTEGER, INTENT(IN) :: k_fmt_fil - end if +!*** Start of declarations rewritten by SPAG -! if (idotime==1) call timing_pause('local2') -! if (idotime==1) call timing_start('local3') +! PARAMETER definitions - ! Calculation of eq. 5.19-5.22 +COMPLEX*16, PARAMETER :: ci=(0.0D0,1.0D0) - do icheb = 0,ncheb - zslc1sum(icheb) = slc1sum(icheb) * (rpanbound(ipan)-rpanbound(ipan-1))/ (2.d0) - end do - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhlr(1,1,0), & - lmsize,yrf(1,1,0,ipan),lmsize2,czero,mrnvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjlr(1,1,0), & - lmsize,yrf(1,1,0,ipan),lmsize2,czero,mrjvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhlr(1,1,0), & - lmsize,zrf(1,1,0,ipan),lmsize2,czero,mrnvz(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjlr(1,1,0), & - lmsize,zrf(1,1,0,ipan),lmsize2,czero,mrjvz(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhli(1,1,0), & - lmsize,yif(1,1,0,ipan),lmsize2,czero,mihvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjli(1,1,0), & - lmsize,yif(1,1,0,ipan),lmsize2,czero,mijvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vhli(1,1,0), & - lmsize,zif(1,1,0,ipan),lmsize2,czero,mihvz(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(0),vjli(1,1,0), & - lmsize,zif(1,1,0,ipan),lmsize2,czero,mijvz(1,1,ipan),lmsize) - do icheb = 1,ncheb - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhlr(1,1,icheb), & - lmsize,yrf(1,1,icheb,ipan),lmsize2,cone,mrnvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjlr(1,1,icheb), & - lmsize,yrf(1,1,icheb,ipan),lmsize2,cone,mrjvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhlr(1,1,icheb), & - lmsize,zrf(1,1,icheb,ipan),lmsize2,cone,mrnvz(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjlr(1,1,icheb), & - lmsize,zrf(1,1,icheb,ipan),lmsize2,cone,mrjvz(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhli(1,1,icheb), & - lmsize,yif(1,1,icheb,ipan),lmsize2,cone,mihvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjli(1,1,icheb), & - lmsize,yif(1,1,icheb,ipan),lmsize2,cone,mijvy(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vhli(1,1,icheb), & - lmsize,zif(1,1,icheb,ipan),lmsize2,cone,mihvz(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize2,zslc1sum(icheb),vjli(1,1,icheb), & - lmsize,zif(1,1,icheb,ipan),lmsize2,cone,mijvz(1,1,ipan),lmsize) - end do -! if (idotime==1) call timing_pause('local3') +! Local variables -end do !ipan -#ifdef CPP_hybrid -!$NOOMP END DO -!$NOOMP END PARALLEL -#endif -! end the big loop over the subintervals +COMPLEX*16 b(n,n),ca,cb,arg,dtab(0:n*n) +CHARACTER (LEN=1) :: CHAR +LOGICAL :: same,small +CHARACTER (LEN=1) :: ctab(0:n*n),vz(-1:+1) +DOUBLE PRECISION :: DBLE +CHARACTER (LEN=150) :: fmt1,fmt2,fmt3,fmt4 +INTEGER :: i,i1,ic0,id,il,ilsep(20),ipt(218),iq,isl,iw(m),j, & + j0,jp,jq,k,l3,lf,mm,n1,n2,n3,nc,nd,nfil,nk,nm,nm1,nm2,nm3, nnon0,nsl +INTEGER :: ICHAR,ISIGN,nint +REAL*8 tol +!*** End of declarations rewritten by SPAG +DATA vz/'-',' ',' '/ -!if (idotime==1) call timing_stop('local') -!if (idotime==1) call timing_start('afterlocal') +small(arg) = ABS(arg*tol) < 1.0D0 -! *********************************************************************** -! calculate A(M), B(M), C(M), D(M) -! according to 5.17-5.18 (regular solution) of Bauer PhD -! C,D are calculated accordingly for the irregular solution -! (starting condition: A(0) = 1, B(0) = 0, C(MMAX) = 0 and D(MMAX) = 1) -! *********************************************************************** +same(ca,cb) = small(1.0D0-ca/cb) -! regular -do lm2 = 1,lmsize - do lm1 = 1,lmsize - bllp(lm1,lm2,0) = czero - allp(lm1,lm2,0) = czero - end do -end do +nfil = ABS(k_fmt_fil) -do lm1 = 1,lmsize - allp(lm1,lm1,0) = cone -end do +tol = 1.0D0/tolp -do ipan = 1,npan - call zcopy(lmsize*lmsize,allp(1,1,ipan-1),1,allp(1,1,ipan),1) - call zcopy(lmsize*lmsize,bllp(1,1,ipan-1),1,bllp(1,1,ipan),1) - call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mrnvy(1,1,ipan), & - lmsize,allp(1,1,ipan-1),lmsize,cone,allp(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mrnvz(1,1,ipan), & - lmsize,bllp(1,1,ipan-1),lmsize,cone,allp(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize, cone,mrjvy(1,1,ipan), & - lmsize,allp(1,1,ipan-1),lmsize,cone,bllp(1,1,ipan),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize, cone,mrjvz(1,1,ipan), & - lMSIZE,BLLP(1,1,IPAN-1),LMSIZE,CONE,BLLP(1,1,IPAN),LMSIZE) -end do +!----------------------------------------------- set block indices IQ JQ -! irregular -do lm2 = 1,lmsize - do lm1 = 1,lmsize - dllp(lm1,lm2,npan) = 0.d0 - cllp(lm1,lm2,npan) = 0.d0 - end do -end do -do lm1 = 1,lmsize - dllp(lm1,lm1,npan) = 1.d0 -end do -do ipan = npan,1,-1 - call zcopy(lmsize*lmsize,cllp(1,1,ipan),1,cllp(1,1,ipan-1),1) - call zcopy(lmsize*lmsize,dllp(1,1,ipan),1,dllp(1,1,ipan-1),1) - call zgemm('n','n',lmsize,lmsize,lmsize, cone,mihvz(1,1,ipan), & - lmsize,cllp(1,1,ipan),lmsize,cone,cllp(1,1,ipan-1),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize, cone,mihvy(1,1,ipan), & - lmsize,dllp(1,1,ipan),lmsize,cone,cllp(1,1,ipan-1),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mijvz(1,1,ipan), & - lmsize,cllp(1,1,ipan),lmsize,cone,dllp(1,1,ipan-1),lmsize) - call zgemm('n','n',lmsize,lmsize,lmsize,-cone,mijvy(1,1,ipan), & - lmsize,dllp(1,1,ipan),lmsize,cone,dllp(1,1,ipan-1),lmsize) -end do +IF ( ijq > 1000 ) THEN + iq = ijq/1000 + jq = ijq - iq*1000 + IF ( iq*n > m .OR. iq*n > m ) THEN + WRITE (6,99002) ijq,iq,jq,iq*n,jq*n,n,m + RETURN + END IF +ELSE + iq = 1 + jq = 1 +END IF + +!----------------------------------------------------- copy matrix block + +j0 = n*(jq-1) +DO j = 1,n + i1 = n*(iq-1)+1 + jp = j0 + j + CALL zcopy(n,a(i1,jp),1,b(1,j),1) +END DO + +!------------------------------------------------ set up character table + +nc = 0 +DO i = 1,26 + nc = nc + 1 + ipt(nc) = 62 + i +END DO +DO i = 1,8 + nc = nc + 1 + ipt(nc) = 96 + i +END DO +DO i = 10,26 + nc = nc + 1 + ipt(nc) = 96 + i +END DO +DO i = 191,218 + nc = nc + 1 + ipt(nc) = i +END DO +DO i = 35,38 + nc = nc + 1 + ipt(nc) = i +END DO +DO i = 40,42 + nc = nc + 1 + ipt(nc) = i +END DO +DO i = 91,93 + nc = nc + 1 + ipt(nc) = i +END DO -! *********************************************************************** -! determine the regular solution ull by using 5.14 -! and the irregular solution sll accordingly -! *********************************************************************** -do ipan = 1,npan - do icheb = 0,ncheb - mn = ipan*ncheb + ipan - icheb - call zgemm('n','n',lmsize2,lmsize,lmsize,cone,yrf(1,1,icheb,ipan), & - lmsize2,allp(1,1,ipan-1),lmsize,czero,ull(1,1,mn),lmsize2) - call zgemm('n','n',lmsize2,lmsize,lmsize,cone,zrf(1,1,icheb,ipan), & - lmsize2,bllp(1,1,ipan-1),lmsize,cone,ull(1,1,mn),lmsize2) - call zgemm('n','n',lmsize2,lmsize,lmsize,cone,zif(1,1,icheb,ipan), & - lmsize2,cllp(1,1,ipan),lmsize,czero,sll(1,1,mn),lmsize2) - call zgemm('n','n',lmsize2,lmsize,lmsize,cone,yif(1,1,icheb,ipan), & - lmsize2,dllp(1,1,ipan),lmsize,cone,sll(1,1,mn),lmsize2) - end do -end do +!---------------------------------------------------------------- header +ic0 = ICHAR('0') +n3 = n/100 +n2 = n/10 - n3*10 +n1 = n - n2*10 - n3*100 -!if (idotime==1) call timing_stop('afterlocal') -!if (idotime==1) call timing_start('endstuff') +IF ( n <= 18 ) THEN + fmt1 = '(8X,I3,''|'',' + fmt2 = '( 9X,''--|'',' + fmt3 = '( 9X,'' #|'',' + fmt4 = '( 9X,'' |'',' +ELSE + fmt1 = '( I4,''|'',' + fmt2 = '( 2X,''--|'',' + fmt3 = '( 2X,'' #|'',' + fmt4 = '( 2X,'' |'',' +END IF -! *********************************************************************** -! next part converts the volterra solution u of equation (5.7) to -! the fredholm solution r by employing eq. 4.122 and 4.120 of bauer, phd -! and the t-matrix is calculated -! *********************************************************************** +lf = 11 +l3 = 11 +IF ( mcol == 0 ) THEN + fmt1 = fmt1(1:lf)//CHAR(ic0+n3)//CHAR(ic0+n2)//CHAR(ic0+n1) & + //'( 2A1),''|'',I3)' + fmt2 = fmt2(1:lf)//CHAR(ic0+n3)//CHAR(ic0+n2)//CHAR(ic0+n1) & + //'(''--''),''|'',I3)' + fmt3 = fmt3(1:lf)//'60(2X,I2))' + fmt4 = fmt4(1:lf)//'60(I2,2X))' + lf = 21 +ELSE + IF ( mcol == 1 ) THEN + nk = nint(SQRT(DBLE(n))) + ELSE IF ( mcol == 2 ) THEN + nk = nint(SQRT(DBLE(n/2))) + ELSE IF ( mcol == 3 ) THEN + nk = 2*nint(SQRT(DBLE(n/2))) - 1 + END IF + DO k = 1,nk + IF ( mcol <= 2 ) THEN + nm = 2*k - 1 + ELSE + nm = 2*((k+1)/2) + END IF + nm2 = nm/10 + nm1 = nm - nm2*10 + nm3 = nm/2 + fmt1 = fmt1(1:lf)//CHAR(ic0+nm2)//CHAR(ic0+nm1) //'( 2A1),''|'',' + fmt2 = fmt2(1:lf)//CHAR(ic0+nm2)//CHAR(ic0+nm1) //'(''--''),''|'',' + + IF ( mcol <= 2 ) THEN + DO mm = 1,nm + IF ( MOD(mm,2) == MOD(k,2) ) THEN + fmt3 = fmt3(1:l3)//'2X,' + fmt4 = fmt4(1:l3)//'I2,' + ELSE + fmt3 = fmt3(1:l3)//'I2,' + fmt4 = fmt4(1:l3)//'2X,' + END IF + l3 = l3 + 3 + END DO + fmt3 = fmt3(1:l3)//'''|'',' + fmt4 = fmt4(1:l3)//'''|'',' + l3 = l3 + 4 + ELSE + fmt3 = fmt3(1:lf)//CHAR(ic0+nm3)//'(2X,I2),''|'',' + fmt4 = fmt4(1:lf)//CHAR(ic0+nm3)//'(I2,2X),''|'',' + l3 = l3 + 13 + END IF + lf = lf + 13 + END DO + IF ( mcol == 2 ) THEN + fmt1 = fmt1(1:lf)//fmt1(12:lf) + fmt2 = fmt2(1:lf)//fmt2(12:lf) + fmt3 = fmt3(1:l3)//fmt3(12:l3) + fmt4 = fmt4(1:l3)//fmt4(12:l3) + lf = 2*lf - 11 + l3 = 2*l3 - 11 + END IF + fmt1 = fmt1(1:lf)//'I3)' + fmt2 = fmt2(1:lf)//'I3)' + fmt3 = fmt3(1:l3)//'I3)' + fmt4 = fmt4(1:l3)//'I3)' +END IF +IF ( mlin == 0 ) THEN + nsl = 1 + ilsep(1) = n +ELSE IF ( mlin == 1 ) THEN + nsl = nint(SQRT(DBLE(n))) + DO il = 1,nsl + ilsep(il) = il**2 + END DO +ELSE IF ( mlin == 2 ) THEN + nsl = nint(SQRT(DBLE(n/2))) + DO il = 1,nsl + ilsep(il) = il**2 + END DO + DO il = 1,nsl + ilsep(nsl+il) = ilsep(nsl) + il**2 + END DO + nsl = 2*nsl +ELSE IF ( mlin == 3 ) THEN + nsl = 2*nint(SQRT(DBLE(n/2))) - 1 + ilsep(1) = 2 + DO k = 2,nsl + ilsep(k) = ilsep(k-1) + 2*((k+1)/2) + END DO +END IF -call zgetrf(lmsize,lmsize,allp(1,1,npan),lmsize,ipiv,info) !invert alpha -call zgetri(lmsize,allp(1,1,npan),lmsize,ipiv,work,lmsize*lmsize,info) !invert alpha -> transformation matrix rll=alpha^-1*rll -#ifdef hostcode -! get alpha matrix -! DO LM1=1,LMSIZE ! LLY -! DO LM2=1,LMSIZE ! LLY -! ALPHAGET(LM1,LM2)=ALLP(LM1,LM2,NPAN) ! LLY -! ENDDO ! LLY -! ENDDO ! LLY -#endif -! calculation of the t-matrix -call zgemm('n','n',lmsize,lmsize,lmsize,cone/gmatprefactor,bllp(1,1,npan), & ! calc t-matrix tll = bll*alpha^-1 - lmsize,allp(1,1,npan),lmsize,czero,tllp,lmsize) -do nm = 1,nrmax -call zgemm('n','n',lmsize2,lmsize,lmsize,cone,ull(1,1,nm), & - lmsize2,allp(1,1,npan),lmsize,czero,rll(1,1,nm),lmsize2) -end do +WRITE (nfil,99001) str(1:lstr) +IF ( ijq > 1000 ) WRITE (nfil,99003) iq,jq +WRITE (nfil,fmt3) (i,i=2,n,2) +WRITE (nfil,fmt4) (i,i=1,n,2) +WRITE (nfil,FMT=fmt2) +!------------------------------------------------------------ header end +nnon0 = 0 +nd = 0 +ctab(0) = ' ' +dtab(0) = 9999D0 -!if (idotime==1) call timing_stop('endstuff') -!if (idotime==1) call timing_start('checknan') -!if (idotime==1) call timing_stop('checknan') -!if (idotime==1) call timing_stop('local1') -!if (idotime==1) call timing_stop('local2') -!if (idotime==1) call timing_stop('local3') -!if (idotime==1) call timing_stop('rllsll') - -if ( use_sratrick==0 ) then - if(allocated(slv)) deallocate ( slv,srv ) -elseif ( use_sratrick==1 ) then - if(allocated(work2)) deallocate ( work2, ipiv2 ) - if(allocated(slv1)) deallocate ( slv1, srv1 ) -! if(allocated(slv2)) deallocate ( slv2, srv2 ) - if(allocated(yill1)) deallocate ( yill1, zill1 ) - if(allocated(yrll1)) deallocate ( yrll1, zrll1 ) - if(allocated(yill2)) deallocate ( yill2, zill2 ) - if(allocated(yrll2)) deallocate ( yrll2, zrll2 ) -end if +DO i = 1,n + DO j = 1,n + IF ( .NOT.small(b(i,j)) ) THEN + nnon0 = nnon0 + 1 + DO id = 1,nd + IF ( same(b(i,j),+dtab(id)) ) THEN + iw(j) = +id + GO TO 50 + END IF + IF ( same(b(i,j),-dtab(id)) ) THEN + iw(j) = -id + GO TO 50 + END IF + END DO +!----------------------------------------------------------- new element + nd = nd + 1 + iw(j) = nd + dtab(nd) = b(i,j) + IF ( ABS(dtab(nd)-1.0D0)*tol < 1.0D0 ) THEN + ctab(nd) = '1' + ELSE IF ( ABS(dtab(nd)+1.0D0)*tol < 1.0D0 ) THEN + dtab(nd) = +1.0D0 + ctab(nd) = '1' + iw(j) = -nd + ELSE IF ( ABS(dtab(nd)-ci)*tol < 1.0D0 ) THEN + ctab(nd) = 'i' + ELSE IF ( ABS(dtab(nd)+ci)*tol < 1.0D0 ) THEN + dtab(nd) = +ci + ctab(nd) = 'i' + iw(j) = -nd + ELSE + ctab(nd) = CHAR(ipt(1+MOD((nd+1),nc))) + END IF + ELSE + iw(j) = 0 + END IF + 50 END DO +!------------------------------------------------------------ write line + WRITE (nfil,FMT=fmt1) i, (vz(ISIGN(1,iw(j))),ctab(ABS(iw(j))),j=1, & + n),i + + DO isl = 1,nsl + IF ( i == ilsep(isl) ) WRITE (nfil,FMT=fmt2) + END DO +END DO -if(allocated(work)) deallocate( work ) -if(allocated(allp)) deallocate( allp, bllp ) -if(allocated(cllp)) deallocate( cllp, dllp ) -if(allocated(mrnvy)) deallocate( mrnvy, mrnvz ) -if(allocated(mrjvy)) deallocate( mrjvy, mrjvz ) -if(allocated(mihvy)) deallocate( mihvy, mihvz ) -if(allocated(mijvy)) deallocate( mijvy, mijvz ) -if(allocated(yill)) deallocate( yill, zill ) -if(allocated(yrll)) deallocate( yrll, zrll ) -if(allocated(vjlr)) deallocate( vjlr, vhlr ) -if(allocated(vjli)) deallocate( vjli, vhli ) -if(allocated(vjlr_yrll1)) deallocate( vjlr_yrll1, vhlr_yrll1 ) -if(allocated(vjli_yill1)) deallocate( vjli_yill1, vhli_yill1 ) -if(allocated(vjlr_zrll1)) deallocate( vjlr_zrll1, vhlr_zrll1 ) -if(allocated(vjli_zill1)) deallocate( vjli_zill1, vhli_zill1 ) -if(allocated(yrll1temp)) deallocate( yrll1temp, zrll1temp ) -if(allocated(yill1temp)) deallocate( yill1temp, zill1temp ) +!------------------------------------------------------------------ foot -if(allocated(yif)) deallocate( yif ) -if(allocated(yrf)) deallocate( yrf ) -if(allocated(zif)) deallocate( zif ) -if(allocated(zrf)) deallocate( zrf ) +WRITE (nfil,fmt4) (i,i=1,n,2) +WRITE (nfil,fmt3) (i,i=2,n,2) -end subroutine +IF ( k_fmt_fil > 0 ) THEN + WRITE (nfil,99004) (id,ctab(id),dtab(id),id=1,nd) + WRITE (nfil,99005) nnon0,tolp,n*n - nnon0,tolp +ELSE + WRITE (nfil,*) ' ' +END IF + +99001 FORMAT (/,8X,a,/) +99002 FORMAT (/,1X,79('*'),/,10X,'inconsistent call of <CMATSTR>',/,10X, & + 'argument IJQ =',i8,' implies IQ=',i3,' JQ=',i3,/,10X, & + 'IQ*N=',i6,' > M or JQ*N=',i6,' > M for N =',i4, & + ' M=',i4,/,1X,79('*'),/) +99003 FORMAT (8X,'IQ-JQ-block for IQ = ',i3,' JQ = ',i3,/) +99004 FORMAT (/,8X,'symbols used:',/,(8X,i3,3X,a1,2X,2F20.12)) +99005 FORMAT (/,8X,i5,' elements >',1PE9.1,/, & + 8X,i5,' elements <',1PE9.1,/) +END SUBROUTINE cmatstr -#ifndef hostcode -END MODULE MOD_RLLSLL -#endif +FUNCTION ikapmue(kappa,muem05) + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-01 Time: 12:21:58 -subroutine getCLambdaCinv(Ncheb,CLambdaCinv) -implicit none -! set up the Lambda matrix which differentiates the coefficients of an -! Chebyshev expansion -integer :: Ncheb -double precision :: CLambdaCinv(0:Ncheb,0:Ncheb) -!local -double precision :: Lambda(0:Ncheb,0:Ncheb) -double precision :: Cmatrix(0:Ncheb,0:Ncheb) -double precision :: Cinvmatrix(0:Ncheb,0:Ncheb) -double precision :: temp1(0:Ncheb,0:Ncheb) -integer n - Lambda=(0.0D0,0.0D0) - Cmatrix=(0.0D0,0.0D0) - Cinvmatrix=(0.0D0,0.0D0) - Lambda=(0.0D0,0.0D0) - temp1=(0.0D0,0.0D0) +! ******************************************************************** +! * * +! * INDEXING OF MATRIX-ELEMENTS: * +! * * +! * I = 2*L*(J+1/2) + J + MUE + 1 * +! * * +! ******************************************************************** -call getLambda(Ncheb,Lambda) -call getCinvmatrix(Ncheb,Cinvmatrix) -call getCmatrix(Ncheb,Cmatrix) -n=Ncheb+1 - call dgemm('N','N',n,n,n,1d0,Lambda,n,Cinvmatrix,n,0d0,temp1,n) - call dgemm('N','N',n,n,n,1d0,Cmatrix,n,temp1,n,0d0,CLambdaCinv,n) -! temp1=matmat_dmdm(Lambda,Cinvmatrix,Ncheb) -! CLambdaCinv=matmat_dmdm(Cmatrix,temp1,Ncheb) -end subroutine +IMPLICIT NONE -subroutine rotatematrix(mat,theta,phi,lmmax,mode) -! rotates a matrix in the local frame pointing in -! the direction of phi and theta to the global frame -implicit none -!interface -double complex,intent(inout) :: mat(2*lmmax,2*lmmax) -double precision,intent(in) :: phi -double precision,intent(in) :: theta -integer :: lmmax -integer :: mode -!local -double complex :: Umat(2*lmmax,2*lmmax) -double complex :: Udeggamat(2*lmmax,2*lmmax) -double complex :: mattemp(2*lmmax,2*lmmax) -!double precision :: matmat_zmzm +INTEGER, INTENT(IN) :: kappa +INTEGER, INTENT(IN) :: muem05 -!*********************************************************************** -! create the rotation matrix: -! | cos(theta/2) exp(-i/2 phi) -sin(theta/2) exp(-i/2 phi) | -! U= | | -! | sin(theta/2) exp( i/2 phi) cos(theta/2) exp( i/2 phi) | -! -! Udegga = transpose(complex conjug ( U ) ) -!*********************************************************************** +! Dummy arguments -call create_Umatrix(theta,phi,lmmax,Umat,Udeggamat) -!*********************************************************************** -! calculate matrix in the global frame: -! -! t_glob = U * t_loc * Udegga -!*********************************************************************** +INTEGER :: ikapmue -if (mode==0) then ! 'loc->glob' - call zgemm('N','N',2*lmmax,2*lmmax,2*lmmax,(1d0,0d0),mat,2*lmmax,Udeggamat,2*lmmax,(0d0,0d0),mattemp,2*lmmax) - call zgemm('N','N',2*lmmax,2*lmmax,2*lmmax,(1d0,0d0),Umat,2*lmmax,mattemp,2*lmmax,(0d0,0d0),mat,2*lmmax) -elseif (mode==1) then !'glob->loc' - call zgemm('N','N',2*lmmax,2*lmmax,2*lmmax,(1d0,0d0),mat,2*lmmax,Umat,2*lmmax,(0d0,0d0),mattemp,2*lmmax) - call zgemm('N','N',2*lmmax,2*lmmax,2*lmmax,(1d0,0d0),Udeggamat,2*lmmax,mattemp,2*lmmax,(0d0,0d0),mat,2*lmmax) -else - stop '[rotatematrix] mode not known' -end if -! writE(324,'(5000F)') tmat -! stop +! Local variables -end subroutine rotatematrix +INTEGER :: IABS +INTEGER :: jp05,l +jp05 = IABS(kappa) -SUBROUTINE spin_orbit_compl(lmax,lmmaxd,l_s) +IF ( kappa < 0 ) THEN + l = -kappa - 1 +ELSE + l = kappa +END IF + +ikapmue = 2*l*jp05 + jp05 + muem05 + 1 + +END FUNCTION ikapmue + + +SUBROUTINE ikmlin(iprint,nsollm,ikm1lin,ikm2lin,nlmax,nmuemax, & + linmax,nl) + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-01 Time: 12:05:20 + +! ******************************************************************** +! * * +! * SETUP TABLE OF INDICES IKM(INT) * +! * * +! * IKM IS STANDARD INDEX IN (KAPPA,MUE)-REPRESENTATION * +! * IKM = 2*L*(J+1/2) + J + MUE + 1 * +! * * +! * INT NUMBERS LINEARLY ONLY NON-VANISHING ELEMENTS OF M-SS * +! * USED TO CALCULATE DOS ... * +! * * +! ******************************************************************** IMPLICIT NONE -INTEGER, INTENT(IN) :: lmax -INTEGER, INTENT(IN) :: lmmaxd -DOUBLE COMPLEX, INTENT(OUT):: l_s(:,:) -! ************************************************************************ -! in this subroutine the matrix L*S is calculated for the basis of -! real spherical harmonics +INTEGER, INTENT(IN) :: iprint +INTEGER, INTENT(IN) :: nsollm(nlmax,nmuemax) +INTEGER, INTENT(OUT) :: ikm1lin(linmax) +INTEGER, INTENT(OUT) :: ikm2lin(linmax) +INTEGER, INTENT(IN) :: nlmax +INTEGER, INTENT(IN) :: nmuemax +INTEGER, INTENT(IN) :: linmax +INTEGER, INTENT(IN) :: nl -! local variableINTEGER :: i1,i2,i1l,rl,lm1,lm2 -INTEGER :: rl,lm1,lm2 -DOUBLE COMPLEX,allocatable :: ls_l(:,:) +! Dummy arguments -!icompl=(0D0,1D0) -CALL cinit((2*lmmaxd)**2,l_s) +! Local variables -DO rl=0,lmax - - allocate(ls_l((2*rl+1)*2,(2*rl+1)*2)) - CALL cinit(((2*rl+1)*2)**2,ls_l) - - - CALL spin_orbit_one_l(rl,ls_l) +INTEGER :: i,il,imue,k1,k2,kap(2),l,lin,muem05,nsol +!INTEGER :: ikapmue + +lin = 0 + +DO il = 1,nl + l = il - 1 + muem05 = -il - 1 + kap(1) = -l - 1 + kap(2) = +l - DO lm1=1,(2*rl+1)*2 + DO imue = 1,2*il + muem05 = muem05 + 1 + nsol = nsollm(il,imue) - IF (lm1 <= 2*rl+1 ) THEN - DO lm2=1,(2*rl+1) - l_s(rl**2+lm1,rl**2+lm2)=0.5D0*ls_l(lm1,lm2) - END DO - DO lm2=(2*rl+1)+1,(2*rl+1)*2 - l_s(rl**2+lm1,lmmaxd+rl**2-(2*rl+1)+lm2)= 0.5D0*ls_l(lm1,lm2) - END DO - ELSE - DO lm2=1,(2*rl+1) - l_s(lmmaxd+rl**2-(2*rl+1)+lm1,rl**2+lm2)= 0.5D0*ls_l(lm1,lm2) - END DO - DO lm2=(2*rl+1)+1,(2*rl+1)*2 - l_s(lmmaxd+rl**2-(2*rl+1)+lm1,lmmaxd+rl**2-(2*rl+1)+lm2)= & - 0.5D0*ls_l(lm1,lm2) + DO k2 = 1,nsol + DO k1 = 1,nsol + lin = lin + 1 + ikm1lin(lin) = ikapmue(kap(k1),muem05) + ikm2lin(lin) = ikapmue(kap(k2),muem05) END DO - END IF + END DO - END DO !lm1 - - deallocate(ls_l) - - -END DO !rl=0,lmax - - -END SUBROUTINE spin_orbit_compl + END DO +END DO +IF ( iprint < 2 ) RETURN +WRITE (6,FMT='('' INT='',I3,'' IKM=('',I3,'','',I3,'')'')') & + (i,ikm1lin(i),ikm2lin(i),i=1,lin) +END SUBROUTINE ikmlin -SUBROUTINE beshank(hl,jl,z,lmax) +SUBROUTINE strsmat(lmax,cgc,srrel,nrrel,irrel,nkmmax,nkmpmax) ! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-19 Time: 12:22:05 +! Date: 2016-04-01 Time: 12:05:34 -!----------------------------------------------------------------------- -! calculates spherical bessel, hankel and neumann functions -! for the orders lmin .le. l .le. lmax. -! For |z| .lt. l+1 the taylor expansions of jl and nl are used. -! For |z| .ge. l+1 the explicit expressions for hl(+), hl(-) are used. -!----------------------------------------------------------------------- -! .. Parameters .. -DOUBLE COMPLEX ci -PARAMETER (ci= (0.0D0,1.0D0)) -! .. -! .. Scalar Arguments .. -DOUBLE COMPLEX z -INTEGER :: lmax -! .. -! .. Array Arguments .. -DOUBLE COMPLEX hl(0:lmax),jl(0:lmax),nl(0:lmax) -! .. -! .. Local Scalars .. -DOUBLE COMPLEX termj,termn,z2,zj,zn -DOUBLE PRECISION :: rl,rn,rnm -INTEGER :: l,m,n -! .. -! .. Intrinsic Functions .. -INTRINSIC CDABS,EXP -! .. -zj = 1.d0 -zn = 1.d0 -z2 = z*z -IF (CDABS(z) < lmax+1.d0) THEN - DO l = 0,lmax - rl = l + l - termj = -0.5D0/ (rl+3.d0)*z2 - termn = 0.5D0/ (rl-1.d0)*z2 - jl(l) = 1.d0 - nl(l) = 1.d0 - DO n = 2,25 - jl(l) = jl(l) + termj - nl(l) = nl(l) + termn - rn = n + n - termj = -termj/ (rl+rn+1.d0)/rn*z2 - termn = termn/ (rl-rn+1.d0)/rn*z2 - END DO - jl(l) = jl(l)*zj - nl(l) = -nl(l)*zn/z - hl(l) = jl(l) + nl(l)*ci - - zj = zj*z/ (rl+3.d0) - zn = zn/z* (rl+1.d0) - END DO -END IF +! ******************************************************************** +! * * +! * INITIALIZE TRANSFORMATION MATRIX THAT TAKES MATRICES FROM * +! * RELATIVISTIC TO REAL SPERICAL HARM. REPRESENTATION * +! * * +! * ONLY THE NON-0 ELEMENTS OF THE MATRIX ARE STORED * +! * * +! * 25/10/95 HE proper convention of trans. matrix introduced * +! ******************************************************************** -DO l = 0,lmax - IF (CDABS(z) >= l+1.d0) THEN - hl(l) = 0.d0 - nl(l) = 0.d0 - rnm = 1.d0 - DO m = 0,l - hl(l) = hl(l) + rnm/ (-ci* (z+z))**m - nl(l) = nl(l) + rnm/ (ci* (z+z))**m - rnm = rnm* (l*l+l-m*m-m)/ (m+1.d0) - END DO - hl(l) = hl(l)* (-ci)**l*EXP(ci*z)/ (ci*z) - nl(l) = nl(l)*ci**l*EXP(-ci*z)/ (-ci*z) - jl(l) = (hl(l)+nl(l))*0.5D0 - nl(l) = (hl(l)-jl(l))/ci - END IF -END DO +IMPLICIT NONE -RETURN +INTEGER, INTENT(IN) :: lmax +REAL*8, INTENT(IN) :: cgc(nkmpmax,2) +COMPLEX*16, INTENT(OUT) :: srrel(2,2,nkmmax) +INTEGER, INTENT(OUT) :: nrrel(2,nkmmax) +INTEGER, INTENT(OUT) :: irrel(2,2,nkmmax) +INTEGER, INTENT(IN) :: nkmmax +INTEGER, INTENT(IN) :: nkmpmax + +! PARAMETER definitions -END SUBROUTINE +COMPLEX*16, PARAMETER :: ci=(0.0D0,1.0D0) +COMPLEX*16, PARAMETER :: c1=(1.0D0,0.0D0) +COMPLEX*16, PARAMETER :: c0=(0.0D0,0.0D0) -SUBROUTINE beshank_smallcomp(hl,jl,zval,tau,eryd,lmax) -IMPLICIT NONE -!----------------------------------------------------------------------- -! takes the spherical bessel etc functions stored in an array up to LMAX -! array entries from LMAX+1 to 2*LMAX are assumed to be empty -! these values are filled with the potential-free solution of the -! SRA-equations -!----------------------------------------------------------------------- -DOUBLE COMPLEX hl(0:2*(lmax+1)-1), jl(0:2*(lmax+1)-1), & - nl(0:2*(lmax+1)-1) -DOUBLE PRECISION :: cvlight -PARAMETER (cvlight=274.0720442D0) -DOUBLE COMPLEX zval -DOUBLE COMPLEX eryd -DOUBLE PRECISION :: tau -INTEGER :: lmax +! Dummy arguments -! DOUBLE PRECISION CVLIGHT -DOUBLE COMPLEX prefac -INTEGER :: il,il2 -prefac = 1.0D0 / (1.0D0+eryd/cvlight**2) / tau !/cvlight !last cvlight for small component test -il=0 -il2=il+lmax+1 -nl(il2)=prefac * (zval* (-nl(il+1)) ) -jl(il2)=prefac * (zval* (-jl(il+1)) ) -! HL(IL2)=JL(IL2)+ CI*NL(IL2) -hl(il2)=prefac * (zval* (-hl(il+1)) ) -! write(*,'(5000E)') tau,HL(IL2),JL(IL2)+ (0.0D0,1.0D0)*NL(IL2) -! write(*,'(5000E)') tau,HL(0),JL(0)+ (0.0D0,1.0D0)*NL(0) -prefac = 1.0D0 / (1.0D0+eryd/cvlight**2) / tau !/cvlight !last cvlight for small component test -DO il=1,lmax - il2=il+lmax+1 - nl(il2)=prefac * ( zval * nl(il-1)-(il+1)*nl(il) ) - jl(il2)=prefac * ( zval * jl(il-1)-(il+1)*jl(il) ) -! HL(IL2)=JL(IL2)+ CI*NL(IL2) - hl(il2)=prefac * ( zval * hl(il-1)-(il+1)*hl(il) ) -! HL(IL2)=PREFAC * ( ZVAL * HL(IL-1)-(IL+1)*HL(IL) ) -! write(*,'(5000E)') tau,HL(IL2),JL(IL2)+ (0.0D0,1.0D0)*NL(IL2) -END DO +! Local variables -END SUBROUTINE beshank_smallcomp +COMPLEX*16 crel(nkmmax,nkmmax),rc(nkmmax,nkmmax), rrel(nkmmax,nkmmax) +INTEGER :: i,ikm,j,jp05,k,l,lam,lm,lnr,lr,m,muem05,muep05,nk,nkm,nlm, ns1,ns2 +REAL*8 w +nk = 2*(lmax+1) + 1 +nlm = (lmax+1)**2 +nkm = 2*nlm +! =================================================== +! INDEXING: +! IKM = L*2*(J+1/2) + J + MUE + 1 +! LM = L*(L+1) + M + 1 +! =================================================== -SUBROUTINE chebint(cslc1,csrc1,slc1sum,c1,n) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-19 Time: 14:23:20 - -!--------------------------------------------------------------------- -! this subroutine calculates the matrices for the Chebyshev integration -! as defined on page 141 and 142 of the article: -! Integral Equation Method for the Continuous Spectrum Radial -! Schroedinger Equation by R. A. Gonzales et al -! in Journal of computational physics 134, 134-149 (1997) +! ---------------------------------------------------------------------- +! CREL transforms from COMPLEX (L,M,S) to (KAP,MUE) - representation +! |LAM> = sum[LC] |LC> * CREL(LC,LAM) +! ---------------------------------------------------------------------- +CALL cinit(nkmmax*nkmmax,crel) -! the matrix C is the discrete cosine transform matrix -! the matrix C1 is the inverse of C -! the matrix SL is the left spectral integration matrix -! the matrix SR is the right spectral integration matrix -! the matrix CSLC1 is the product of C, SL and C1 -! the matrix CSRC1 is the product of C, SR and C1 -!--------------------------------------------------------------------- -! .. Local Scalars .. -DOUBLE PRECISION :: pi -INTEGER :: j,k -! .. -! .. Local Arrays .. -DOUBLE PRECISION :: c(0:n,0:n),c1(0:n,0:n),s1(0:n,0:n),s2(0:n,0:n), & - sl(0:n,0:n),slc1(0:n,0:n),sr(0:n,0:n), src1(0:n,0:n) -! .. -! .. External Subroutines .. -EXTERNAL dgemm -! .. -! .. Intrinsic Functions .. -INTRINSIC ATAN,COS -! .. -! .. Array Arguments .. -DOUBLE PRECISION :: cslc1(0:n,0:n),csrc1(0:n,0:n),slc1sum(0:n) -! .. -! .. Scalar Arguments .. -INTEGER :: n -! .. -pi = 4.d0*ATAN(1.d0) -!--------------------------------------------------------------------- -! determine the discrete cosine transform matrix from the zeros of the -! Chebyshev polynomials -DO j = 0,n - DO k = 0,n - c(k,j) = COS(((2*k+1)*j*pi)/ (2* (n+1))) - END DO -END DO -!--------------------------------------------------------------------- -! determine the inverse of the discrete cosine transform matrix from -! the transpose of the discrete cosine transform matrix -DO j = 0,n - DO k = 0,n - c1(k,j) = c(j,k)*2.d0/ (n+1) - END DO - c1(0,j) = c1(0,j)*0.5D0 -END DO -!--------------------------------------------------------------------- -! next to statements can be used to check the products CT*C and C1*C -CALL dgemm('T','N',n+1,n+1,n+1,1.d0,c,n+1,c,n+1,0.d0,sr,n+1) -CALL dgemm('N','N',n+1,n+1,n+1,1.d0,c1,n+1,c,n+1,0.d0,sr,n+1) -!--------------------------------------------------------------------- -! preparation of the left and right -! spectral integration matrices SL and SR -DO j = 0,n - DO k = 0,n - s1(k,j) = 0.0D0 - s2(k,j) = 0.0D0 +lm = 0 +DO lnr = 0,lmax + DO m = -lnr,lnr + lm = lm + 1 + + ikm = 0 + DO k = 1,nk + l = k/2 + IF ( 2*l == k ) THEN + jp05 = l + ELSE + jp05 = l + 1 + END IF + + DO muem05 = -jp05,(jp05-1) + muep05 = muem05 + 1 + ikm = ikm + 1 + + IF ( l == lnr ) THEN + IF ( muep05 == m ) crel(lm,ikm) = cgc(ikm,1) + IF ( muem05 == m ) crel(lm+nlm,ikm) = cgc(ikm,2) + END IF + + END DO + END DO + END DO END DO -DO j = 0,n - s1(0,j) = (-1.d0)** (j+1) - s1(j,j) = 1.d0 -END DO -DO j = 2,n - 1 - s2(j,j-1) = 0.5D0/j - s2(j,j+1) = -0.5D0/j -END DO -s2(n,n-1) = 0.5D0/n -s2(1,0) = 1.d0 -s2(1,2) = -0.5D0 -CALL dgemm('N','N',n+1,n+1,n+1,1.d0,s1,n+1,s2,n+1,0.d0,sl,n+1) -DO j = 0,n - DO k = 0,n - s1(k,j) = 0.0D0 + +! ---------------------------------------------------------------------- +! RC transforms from REAL to COMPLEX (L,M,S) - representation +! |LC> = sum[LR] |LR> * RC(LR,LC) +! ---------------------------------------------------------------------- +CALL cinit(nkmmax*nkmmax,rc) + +w = 1.0D0/SQRT(2.0D0) + +DO l = 0,lmax + DO m = -l,l + i = l*(l+1) + m + 1 + j = l*(l+1) - m + 1 + + IF ( m < 0 ) THEN + rc(i,i) = -ci*w + rc(j,i) = w + rc(i+nlm,i+nlm) = -ci*w + rc(j+nlm,i+nlm) = w + END IF + IF ( m == 0 ) THEN + rc(i,i) = c1 + rc(i+nlm,i+nlm) = c1 + END IF + IF ( m > 0 ) THEN + rc(i,i) = w*(-1.0D0)**m + rc(j,i) = ci*w*(-1.0D0)**m + rc(i+nlm,i+nlm) = w*(-1.0D0)**m + rc(j+nlm,i+nlm) = ci*w*(-1.0D0)**m + END IF END DO END DO -DO j = 0,n - s1(j,j) = -1.d0 - s1(0,j) = 1.d0 -END DO -CALL dgemm('N','N',n+1,n+1,n+1,1.d0,s1,n+1,s2,n+1,0.d0,sr,n+1) -!--------------------------------------------------------------------- -! determination of the products C*SL*C1 and C*SR*C1 -CALL dgemm('N','N',n+1,n+1,n+1,1.d0,sl,n+1,c1,n+1,0.d0,slc1,n+1) -CALL dgemm('N','N',n+1,n+1,n+1,1.d0,c,n+1,slc1,n+1,0.d0,cslc1,n+1) -CALL dgemm('N','N',n+1,n+1,n+1,1.d0,sr,n+1,c1,n+1,0.d0,src1,n+1) -CALL dgemm('N','N',n+1,n+1,n+1,1.d0,c,n+1,src1,n+1,0.d0,csrc1,n+1) -!--------------------------------------------------------------------- -DO k = 0,n - slc1sum(k) = 0.0D0 - DO j = 0,n - slc1sum(k) = slc1sum(k) + slc1(j,k) + +! ---------------------------------------------------------------------- +! RREL transforms from REAL (L,M,S) to (KAP,MUE) - representation +! |LAM> = sum[LR] |LR> * RREL(LR,LAM) +! ---------------------------------------------------------------------- +CALL zgemm('N','N',nkm,nkm,nkm,c1,rc,nkmmax,crel,nkmmax,c0,rrel, nkmmax) + +! --------------------------------------------------- +! store the elements of RREL +! --------------------------------------------------- +DO lam = 1,nkm + ns1 = 0 + ns2 = 0 + + DO lr = 1,2*nlm + IF ( CDABS(rrel(lr,lam)) > 1D-6 ) THEN + IF ( lr <= nlm ) THEN + ns1 = ns1 + 1 + IF ( ns1 > 2 ) STOP ' IN <STRSMAT> NS1 > 2' + srrel(ns1,1,lam) = rrel(lr,lam) + irrel(ns1,1,lam) = lr + ELSE + ns2 = ns2 + 1 + IF ( ns2 > 2 ) STOP ' IN <STRSMAT> NS2 > 2' + srrel(ns2,2,lam) = rrel(lr,lam) + irrel(ns2,2,lam) = lr - nlm + END IF + END IF END DO + + nrrel(1,lam) = ns1 + nrrel(2,lam) = ns2 END DO -RETURN -END SUBROUTINE -subroutine getLambda(Ncheb,Lambda) -! set up the Lambda matrix which differentiates the coefficients of an -! Chebyshev expansion -implicit none -integer :: Ncheb -double precision :: Lambda(0:Ncheb,0:Ncheb) -!local -integer icheb,icheb2 -do icheb2=1,Ncheb,2 - Lambda(0,icheb2)=icheb2 -end do -do icheb=1,Ncheb - do icheb2=icheb+1,Ncheb,2 - Lambda(icheb,icheb2)=icheb2*2 - end do -end do -end subroutine +END SUBROUTINE strsmat + +SUBROUTINE vllmat(irmin,irc,lmmax,lmmaxso,vnspll0,vins, & + cleb,icleb,iend,nspin,z,rnew,use_sratrick) +! ************************************************************************ +! .. Parameters .. +IMPLICIT NONE + +INTEGER, INTENT(IN) :: irmin +!INTEGER, INTENT(IN) :: nrmaxd +INTEGER, INTENT(IN) :: irc +INTEGER, INTENT(IN) :: lmmax +INTEGER, INTENT(IN) :: lmmaxso +DOUBLE COMPLEX, INTENT(OUT) :: vnspll0(:,:,irmin:) +DOUBLE PRECISION, INTENT(IN OUT) :: vins(irmin:,:,:) +DOUBLE PRECISION, INTENT(IN) :: cleb(:) +INTEGER, INTENT(IN) :: icleb(:,:) +INTEGER, INTENT(IN) :: iend +INTEGER, INTENT(IN) :: nspin +DOUBLE PRECISION, INTENT(IN) :: z +DOUBLE PRECISION, INTENT(IN) :: rnew(irmin:) +INTEGER, INTENT(IN OUT) :: use_sratrick +!INCLUDE 'inc.p' +!INTEGER :: lmpotd +!DOUBLE PRECISION, INTENT, PARAMETER :: lmpotd= (lpotd+1)**2 +! .. +! .. Scalar Arguments .. -subroutine getCinvmatrix(Ncheb,Cinvmatrix) -! calculates the C**-1 matrix according to: -! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) -implicit none -integer, intent(in) :: ncheb -double precision, intent(out) :: Cinvmatrix(0:Ncheb,0:Ncheb) -!local -double precision :: pi -integer :: icheb1,icheb2 -double precision :: fac +INTEGER :: isp +! .. +! .. Array Arguments .. +DOUBLE PRECISION, allocatable :: vnspll(:,:,:,:) -pi=4d0*datan(1d0) -fac=1.0D0/(Ncheb+1) -do icheb1=0,ncheb - do icheb2=0,ncheb - Cinvmatrix(icheb1,icheb2)=fac*dcos(icheb1*pi*((Ncheb-icheb2)+0.5D0)/(Ncheb+1)) - end do - fac=2.0D0/(Ncheb+1) -end do +! .. +! .. Local Scalars .. +INTEGER :: i,ir,j,lm1,lm2,lm3 +! .. -end subroutine getCinvmatrix +allocate(vnspll(lmmax,lmmax,irmin:irc,2)) -subroutine getCmatrix(Ncheb,Cmatrix) -! calculates the C matrix according to: -! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) -implicit none -integer, intent(in) :: ncheb -double precision, intent(out) :: Cmatrix(0:Ncheb,0:Ncheb) -double precision :: pi -!local -integer :: icheb1,icheb2 +DO isp=1,nspin + DO lm1 = 1,lmmax + DO lm2 = 1,lm1 + DO ir = irmin,irc + vnspll(lm1,lm2,ir,isp) = 0.0D0 + END DO + END DO + END DO + + DO j = 1,iend + lm1 = icleb(j,1) + lm2 = icleb(j,2) + lm3 = icleb(j,3) + DO i = irmin,irc + vnspll(lm1,lm2,i,isp) = vnspll(lm1,lm2,i,isp) + cleb(j)*vins(i,lm3,isp) + END DO + END DO + +!---> use symmetry of the gaunt coef. + + DO lm1 = 1,lmmax + DO lm2 = 1,lm1 - 1 + DO i = irmin,irc + vnspll(lm2,lm1,i,isp) = vnspll(lm1,lm2,i,isp) + END DO + END DO + END DO + + IF (use_sratrick == 0) THEN + DO lm1=1,lmmax + DO i=irmin,irc + vnspll(lm1,lm1,i,isp)=vnspll(lm1,lm1,i,isp)+ & + vins(i,1,isp)-2D0*z/rnew(i) + END DO + END DO + END IF + +END DO !NSPIN -pi=4d0*datan(1d0) -do icheb1=0,ncheb - do icheb2=0,ncheb - ! maybe incorrect - Cmatrix(icheb2,icheb1)=dcos(icheb1*pi*((Ncheb-icheb2)+0.5D0)/(Ncheb+1)) - end do -end do -end subroutine getCmatrix +! set vnspll as twice as large -subroutine create_Umatrix(theta,phi,lmmax,Umat,Udeggamat) -implicit none -!*********************************************************************** -! create the rotation matrix: -! | cos(theta/2) exp(-i/2 phi) -sin(theta/2) exp(-i/2 phi) | -! U= | | -! | sin(theta/2) exp( i/2 phi) cos(theta/2) exp( i/2 phi) | -! -! Udegga = transpose(complex conjug ( U ) ) -!***********************************************************************double -!precision :: phi -!interface -double precision,intent(in) :: phi -double precision,intent(in) :: theta -integer,intent(in) :: lmmax -double complex,intent(out) :: Umat(2*lmmax,2*lmmax) -double complex,intent(out) :: Udeggamat(2*lmmax,2*lmmax) -!local -double complex :: Umat11,Umat12,Umat21,Umat22 -double complex :: Udeggamat11,Udeggamat12,Udeggamat21,Udeggamat22 -integer :: ival -double complex,parameter :: ci=(0.0D0,1.0D0) -character*25 :: spinmode +vnspll0(1:lmmax,1:lmmax,irmin:irc)= vnspll(1:lmmax,1:lmmax,irmin:irc,1) -spinmode='kkr' -if (spinmode=='regular') then - Umat11 = cos(theta/2.0D0)*exp(-ci/2.0D0*phi) - Umat12 = -sin(theta/2.0D0)*exp(-ci/2.0D0*phi) - Umat21 = sin(theta/2.0D0)*exp( ci/2.0D0*phi) - Umat22 = cos(theta/2.0D0)*exp( ci/2.0D0*phi) -else if (spinmode=='kkr') then - Umat11 = cos(theta/2.0D0)*exp( ci/2.0D0*phi) - Umat12 = sin(theta/2.0D0)*exp( ci/2.0D0*phi) - Umat21 = -sin(theta/2.0D0)*exp(-ci/2.0D0*phi) - Umat22 = cos(theta/2.0D0)*exp(-ci/2.0D0*phi) -else - stop '[create_Umatrix] mode not known' -end if +vnspll0(lmmax+1:lmmaxso,lmmax+1:lmmaxso,irmin:irc)= & + vnspll(1:lmmax,1:lmmax,irmin:irc,nspin) +END SUBROUTINE vllmat -Umat=(0.0D0,0.0D0) -do ival=1,lmmax - Umat( ival, ival) = Umat11 - Umat( ival,lmmax+ival) = Umat12 - Umat(lmmax+ival,ival) = Umat21 - Umat(lmmax+ival,lmmax+ival) = Umat22 -end do -if (spinmode=='regular') then -Udeggamat11 = cos(theta/2.0D0)*exp( ci/2.0D0*phi) -Udeggamat12 = sin(theta/2.0D0)*exp(-ci/2.0D0*phi) -Udeggamat21 = -sin(theta/2.0D0)*exp( ci/2.0D0*phi) -Udeggamat22 = cos(theta/2.0D0)*exp(-ci/2.0D0*phi) -else if (spinmode=='kkr') then -Udeggamat11 = cos(theta/2.0D0)*exp(-ci/2.0D0*phi) -Udeggamat12 = -sin(theta/2.0D0)*exp( ci/2.0D0*phi) -Udeggamat21 = sin(theta/2.0D0)*exp(-ci/2.0D0*phi) -Udeggamat22 = cos(theta/2.0D0)*exp( ci/2.0D0*phi) -else - stop '[create_Umatrix] mode not known' -end if +SUBROUTINE spinorbit_ham(lmax,lmmaxd,vins,rnew,e,z,c,socscale, & + nspin,lmpotd,theta,phi, & + ipan_intervall,rpan_intervall, & + npan_tot,ncheb,irmdnew,nrmaxd,vnspll,vnspll1, & + mode,soc) + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-18 Time: 14:28:35 + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: lmax +INTEGER, INTENT(IN) :: lmmaxd +DOUBLE PRECISION, INTENT(IN) :: vins(irmdnew,lmpotd,nspin) +DOUBLE PRECISION, INTENT(IN) :: rnew(nrmaxd) +DOUBLE COMPLEX, INTENT(IN OUT) :: e +DOUBLE PRECISION, INTENT(IN) :: z +DOUBLE PRECISION, INTENT(IN) :: c +DOUBLE PRECISION, INTENT(IN) :: socscale +!INTEGER, INTENT(IN) :: nsra +INTEGER, INTENT(IN) :: nspin +INTEGER, INTENT(IN) :: lmpotd +DOUBLE PRECISION, INTENT(IN) :: theta +DOUBLE PRECISION, INTENT(IN) :: phi +INTEGER, INTENT(IN) :: ipan_intervall(0:) +DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(0:) +INTEGER, INTENT(IN) :: npan_tot +INTEGER, INTENT(IN) :: ncheb +INTEGER, INTENT(IN) :: irmdnew +INTEGER, INTENT(IN OUT) :: nrmaxd +DOUBLE COMPLEX, INTENT(IN) :: vnspll(:,:,:) +DOUBLE COMPLEX, INTENT(OUT) :: vnspll1(:,:,:) +CHARACTER(LEN=*), INTENT(IN) :: mode +LOGICAL, INTENT(IN) :: soc !switches SOC on and off -Udeggamat=(0.0D0,0.0D0) -do ival=1,lmmax - Udeggamat( ival, ival) = Udeggamat11 - Udeggamat( ival,lmmax+ival) = Udeggamat12 - Udeggamat(lmmax+ival,ival) = Udeggamat21 - Udeggamat(lmmax+ival,lmmax+ival) = Udeggamat22 -end do -end subroutine create_Umatrix -SUBROUTINE spin_orbit_one_l(lmax,l_s) +DOUBLE PRECISION :: vr(irmdnew),dvdr(irmdnew) +DOUBLE PRECISION :: rmass(irmdnew),hsofac(irmdnew) +DOUBLE PRECISION :: rnucl,atn,widthfac +INTEGER :: ir,ip,lm1,lm2,ispin,irmin,irmax,ncoll +DOUBLE COMPLEX lsmh(2*lmmaxd,2*lmmaxd),temp +DOUBLE PRECISION :: clambdacinv(0:ncheb,0:ncheb) +!DOUBLE PRECISION :: matvec_dmdm +LOGICAL :: test,opt +EXTERNAL test,opt -IMPLICIT NONE +vnspll1=(0D0,0D0) +vr=0D0 +DO ispin=1,nspin + DO ir=1,ipan_intervall(npan_tot) + vr(ir)=vr(ir)+vins(ir,1,ispin)/nspin + END DO +END DO +! derivative of potential +dvdr=0D0 +CALL getclambdacinv(ncheb,clambdacinv) +DO ip=1,npan_tot + irmin=ipan_intervall(ip-1)+1 + irmax=ipan_intervall(ip) + widthfac= 2D0/(rpan_intervall(ip)-rpan_intervall(ip-1)) + CALL dgemv('N',ncheb+1,ncheb+1,1D0,clambdacinv,ncheb+1, & + vr(irmin:irmax),1,0D0,dvdr(irmin:irmax),1) + dvdr(irmin:irmax)= dvdr(irmin:irmax)*widthfac +END DO +! core potential +IF (z > 24D0) THEN + atn=-16.1532921+2.70335346*z +ELSE + atn=0.03467714+2.04820786*z +END IF +rnucl=1.2D0/0.529177D0*atn**(1./3D0)*1.d-5 -INTEGER, INTENT(IN) :: lmax -DOUBLE COMPLEX, INTENT(OUT) :: l_s((2*lmax+1)*2,(2*lmax+1)*2) -! ************************************************************************ -! in this subroutine the matrix L*S is calculated for the basis of -! real spherical harmonics +DO ir=1,ipan_intervall(npan_tot) + IF (rnew(ir) <= rnucl) THEN +! DVDR(IR)=DVDR(IR)+2d0*Z*RNEW(IR)/RNUCL**3d0 + ELSE +! DVDR(IR)=DVDR(IR)+2d0*Z/RNEW(IR)**2d0 + END IF + dvdr(ir)=dvdr(ir)+2D0*z/rnew(ir)**2D0 +END DO +! contruct LS matrix -! schematically it has the form -! ( -L_z L_+ ) -! ( L_- L_z ) +CALL spin_orbit_compl(lmax,lmmaxd,lsmh) +! roate LS matrix +ncoll=1 +IF (ncoll == 1) THEN + CALL rotatematrix(lsmh,theta,phi,lmmaxd,1) +END IF +IF (mode == 'transpose') THEN + DO lm1=1,2*lmmaxd + DO lm2=1,lm1-1 + temp=lsmh(lm2,lm1) + lsmh(lm2,lm1)=lsmh(lm1,lm2) + lsmh(lm1,lm2)=temp + END DO + END DO +ELSE IF (mode == '1') THEN +END IF +! contruct prefactor of spin-orbit hamiltonian +hsofac=0D0 +DO ir=1,irmdnew + rmass(ir)=0.5D0-0.5D0/c**2*((vr(ir)-REAL(e))-2D0*z/rnew(ir)) + IF (soc .eqv. .false. .OR. z < 1D-6) THEN + hsofac(ir)=0D0 + ELSE + hsofac(ir)=socscale/(2D0*rmass(ir)**2*c**2*rnew(ir))*dvdr(ir) + END IF + +! add to potential + + DO lm1=1,2*lmmaxd + DO lm2=1,2*lmmaxd + vnspll1(lm1,lm2,ir)=vnspll(lm1,lm2,ir)+hsofac(ir)*lsmh(lm1,lm2) + END DO + END DO +END DO +END SUBROUTINE spinorbit_ham -! local variables -INTEGER :: i1,i2,i1l -DOUBLE COMPLEX :: icompl -DOUBLE COMPLEX,allocatable :: l_min(:,:) -DOUBLE COMPLEX,allocatable :: l_up(:,:) -DOUBLE PRECISION :: lfac +subroutine vllmatsra(vll0,vll,rmesh,lmsize,nrmax,nrmaxd,eryd,cvlight,lmax,lval_in,cmode) +!************************************************************************************ +! The perubation matrix for the SRA-equations are set up +!************************************************************************************ +implicit none +!interface + DOUBLE COMPLEX VLL(2*lmsize,2*lmsize,nrmax) + DOUBLE COMPLEX VLL0(lmsize,lmsize,nrmax) + double precision :: rmesh(nrmaxd) + double complex :: eryd + double precision :: cvlight + integer :: lmax,lval_in + integer :: lmsize,nrmax,nrmaxd + character(len=*) :: cmode +!local + integer :: ilm,lval,mval,ival,ir + integer :: loflm(lmsize) + double complex :: Mass,Mass0 + double complex,parameter :: cone=(1.0D0,0.0D0) + double complex,parameter :: czero=(0.0D0,0.0D0) -icompl=(0D0,1D0) +!************************************************************************************ +! determine the bounds of the matricies to get the lm-expansion and the max. number +! of radial points +!************************************************************************************ -allocate(l_min(-lmax:lmax,-lmax:lmax)) -allocate(l_up(-lmax:lmax,-lmax:lmax)) -! initialize the matrix +!************************************************************************************ +! calculate the index array to determine the L value of an LM index +! in case of spin-orbit coupling 2*(LMAX+1)**2 are used instead of (LMAX+1)**2 +! the second half refers to the second spin and has the the same L value +!************************************************************************************ +ilm=0 -DO i1=1,(2*lmax+1)*2 - DO i2=1,(2*lmax+1)*2 - l_s(i2,i1)=0D0 - END DO -END DO +if (lmsize==1) then + loflm(1)=lval_in +elseif ((lmax+1)**2 == lmsize) then + do lval=0,lmax + do mval = -lval,lval + ilm=ilm+1 + loflm(ilm)=lval + end do + end do +elseif (2* (lmax+1)**2 ==lmsize ) then + do ival=1,2 + do lval=0,lmax + do mval = -lval,lval + ilm=ilm+1 + loflm(ilm)=lval + end do + end do + end do +else + stop '[vllmatsra] error' +end if -DO i1=-lmax,lmax - DO i2=-lmax,lmax - l_min(i2,i1)=0D0 - l_up(i2,i1)=0D0 - END DO -END DO -! fill the second and the forth quadrant with L_z -! (-L_z,respectively) -DO i1=1,2*lmax+1 - i1l=i1-lmax-1 ! the value of m (varies from -l to +l) - i2=2*lmax+1-(i1-1) - -! L_S(i2,i1)=icompl*i1l - l_s(i2,i1)=-icompl*i1l - -END DO +vll=(0.0D0,0d0) -DO i1=2*lmax+2,(2*lmax+1)*2 - i1l=i1-lmax-1-(2*lmax+1) ! the value of m (varies from -l to +l) - i2=(2*lmax+1)*2-(i1-(2*lmax+2)) - -! L_S(i2,i1)=-icompl*i1l - l_s(i2,i1)=icompl*i1l - -END DO -! implement now L_- in the third quadrant -IF (lmax>0) THEN - - lfac=SQRT(lmax*(lmax+1D0))/SQRT(2D0) - l_min(0,-1)=-icompl*lfac -! l_min(0,-1)=icompl*lfac - l_min(0,1)=lfac - l_min(-1,0)=icompl*lfac - l_min(1,0)=-lfac - - IF (lmax > 1) THEN - - DO i1=2,lmax - - lfac=0.5D0*SQRT(lmax*(lmax+1D0)-i1*(i1-1D0)) - l_min(-i1,-i1+1)=-lfac - l_min(-i1,i1-1)=icompl*lfac - l_min(i1,-i1+1)=-icompl*lfac - l_min(i1,i1-1)=-lfac - - lfac=0.5D0*SQRT(lmax*(lmax+1D0)-(i1-1)*(i1)) - l_min(-i1+1,-i1)=lfac - l_min(-i1+1,i1)=icompl*lfac - l_min(i1-1,-i1)=-icompl*lfac - l_min(i1-1,i1)=lfac - - END DO - - END IF -END IF +if (cmode=='Ref=0') then + vll(1:lmsize,1:lmsize,:)= vll0 !/cvlight + do ir=1,nrmax + do ival=1,lmsize + lval=loflm(ival) + Mass =cone+(eryd-vll0(ival,ival,ir))/cvlight**2 + Mass0=cone+eryd/cvlight**2 -DO i1=-lmax,lmax - DO i2=-lmax,lmax - l_s(i2+3*lmax+2,i1+lmax+1)=l_min(i1,i2) - END DO -END DO + !************************************************************************************ + ! Conventional potential matrix + !************************************************************************************ + vll(lmsize+ival,lmsize+ival,ir)= -vll0(ival,ival,ir)/cvlight**2 ! TEST 9/22/2011 + vll(ival,ival,ir)=vll(ival,ival,ir)+ (1.0D0/Mass-1.0D0/Mass0)*lval*(lval+1)/rmesh(ir)**2 -! implement now L_+ in the quadrant + !************************************************************************************ + ! The pertubation matrix is changed in the following way + ! + ! from / V11 V12 \ to / V21 V22 \ + ! \ V21 V22 / \-V11 -V12 / + ! because of the convention used for the left solution + !************************************************************************************ + end do !ival -IF (lmax>0) THEN - - lfac=SQRT(lmax*(lmax+1D0))/SQRT(2D0) - l_up(0,-1)=-icompl*lfac - l_up(0,1)=-lfac - l_up(-1,0)=icompl*lfac - l_up(1,0)=lfac - - IF (lmax > 1) THEN - - DO i1=2,lmax - - lfac=0.5D0*SQRT(lmax*(lmax+1D0)-i1*(i1-1D0)) - l_up(-i1,-i1+1)=lfac - l_up(-i1,i1-1)=icompl*lfac - l_up(i1,-i1+1)=-icompl*lfac - l_up(i1,i1-1)=lfac - - lfac=0.5D0*SQRT(lmax*(lmax+1D0)-(i1-1)*(i1)) - l_up(-i1+1,-i1)=-lfac - l_up(-i1+1,i1)=icompl*lfac - l_up(i1-1,-i1)=-icompl*lfac - l_up(i1-1,i1)=-lfac - - END DO - - END IF -END IF + end do !ir +elseif (cmode=='Ref=Vsph') then + vll(lmsize+1:2*lmsize,1:lmsize,:)=vll0 +endif -DO i1=-lmax,lmax - DO i2=-lmax,lmax - l_s(i2+lmax+1,i1+3*lmax+2)=l_up(i1,i2) - END DO -END DO +end subroutine vllmatsra +subroutine rllsllsourceterms(nsra,nvec,eryd,rmesh,nrmax,nrmaxd,lmax,lmsize,use_fullgmat,jlk_index,hlk,jlk,hlk2,jlk2,GMATPREFACTOR) +implicit none +! ************************************************************************ +! calculates the source terms J,H and the left solution J2, H2 for: +! - non-relativistic +! - scalar-relativistic +! - full-relativistic +! calculations +! ************************************************************************ +double complex,parameter :: ci=(0.0d0,1.0d0) +double precision :: cvlight +parameter (cvlight=274.0720442D0) +integer :: nsra,lmax,nrmax,nrmaxd,nvec +double complex :: eryd +double precision :: rmesh(nrmaxd) +integer :: jlk_index(2*lmsize) +integer :: l1,lm1,m1,ivec,ispinfullgmat,ir +integer :: use_fullgmat +integer :: lmsize -deallocate(l_min) -deallocate(l_up) +double complex :: ek,ek2,gmatprefactor +double complex :: hlk(1:4*(lmax+1),nrmax),jlk(1:4*(lmax+1),nrmax) +double complex :: hlk2(1:4*(lmax+1),nrmax),jlk2(1:4*(lmax+1),nrmax) +if (nsra==2) then + nvec=2 +elseif (nsra==1) then + nvec=1 +end if -END SUBROUTINE spin_orbit_one_l -SUBROUTINE rhovalnew(ldorhoef,ielast,nsra,nspin,lmax,ez,wez,zat, & - socscale,cleb,icleb,iend,ifunm,lmsp,ncheb, & - npan_tot,npan_log,npan_eq,rmesh,irws, & - rpan_intervall,ipan_intervall, & - rnew,vinsnew,thetasnew,theta,phi,angle_fixed, & - moment_x,moment_y,moment_z, & - ipot, & - den_out,espv,rho2ns,r2nef,gmatn, muorb, & - lpotd,lmaxd,irmd,irmd_new,iemxd,soc) ! new parameters - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-21 Time: 11:39:57 + lm1 = 1 + do ivec=1,nvec + do ispinfullgmat=0,use_fullgmat + do l1 = 0,lmax + do m1 = -l1,l1 + jlk_index(lm1) = l1+(ivec-1)*(lmax+1)+1 + lm1 = lm1 + 1 + end do + end do + end do!ispinorbit=0,use_fullgmat + end do !nvec - -#ifdef CPP_OMP - use omp_lib -#endif -IMPLICIT NONE +if (nsra==1) then + ek = sqrt(eryd) + ek2 = sqrt(eryd) +elseif (nsra==2) then + ek = sqrt(eryd+(eryd/cvlight)**2) + ek2 = sqrt(eryd+(eryd/cvlight)**2) *(1.0d0+eryd/cvlight**2) +end if -LOGICAL, INTENT(IN) :: ldorhoef -INTEGER, INTENT(IN) :: ielast -INTEGER, INTENT(IN) :: nsra -INTEGER, INTENT(IN) :: nspin -INTEGER, INTENT(IN) :: lmax -DOUBLE COMPLEX, INTENT(IN) :: ez(:) -DOUBLE COMPLEX, INTENT(IN) :: wez(:) -DOUBLE PRECISION, INTENT(IN) :: zat -DOUBLE PRECISION, INTENT(IN) :: socscale -DOUBLE PRECISION, INTENT(IN) :: cleb(:) -INTEGER, INTENT(IN) :: icleb(:,:) -INTEGER, INTENT(IN) :: iend -INTEGER, INTENT(IN) :: ifunm(:) -INTEGER, INTENT(IN) :: lmsp(:) -INTEGER, INTENT(IN) :: ncheb -INTEGER, INTENT(IN) :: npan_tot -INTEGER, INTENT(IN) :: npan_log -INTEGER, INTENT(IN) :: npan_eq -DOUBLE PRECISION, INTENT(IN) :: rmesh(:) -INTEGER, INTENT(IN) :: irws -DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(0:) -INTEGER, INTENT(IN) :: ipan_intervall(0:) -DOUBLE PRECISION, INTENT(IN) :: rnew(:) -DOUBLE PRECISION, INTENT(IN) :: vinsnew(:,:,:) -DOUBLE PRECISION, INTENT(IN) :: thetasnew(:,:) -DOUBLE PRECISION, INTENT(INOUT) :: theta -DOUBLE PRECISION, INTENT(INOUT) :: phi -INTEGER (kind=1), INTENT(IN) :: angle_fixed -DOUBLE PRECISION, INTENT(OUT) :: moment_x -DOUBLE PRECISION, INTENT(OUT) :: moment_y -DOUBLE PRECISION, INTENT(OUT) :: moment_z -!INTEGER, INTENT(IN) :: i1 -INTEGER, INTENT(IN) :: ipot -DOUBLE COMPLEX, INTENT(OUT) :: den_out(0:,:,:) -DOUBLE PRECISION, INTENT(OUT) :: espv(0:,:) -DOUBLE PRECISION, INTENT(OUT) :: rho2ns(:,:,:) -DOUBLE PRECISION, INTENT(OUT) :: r2nef(:,:,:) -DOUBLE COMPLEX, INTENT(IN) :: gmatn(:,:,:) -DOUBLE PRECISION, INTENT(OUT) :: muorb(0:,:) -INTEGER, INTENT(IN) :: lpotd -INTEGER, INTENT(IN) :: lmaxd -INTEGER, INTENT(IN) :: irmd -INTEGER, INTENT(IN) :: irmd_new -INTEGER, INTENT(IN) :: iemxd -LOGICAL, INTENT(IN) :: soc -!INCLUDE 'inc.p' + +do ir = 1,nrmax -!INTEGER, PARAMETER :: lmmaxd= (lmaxd+1)**2 + call beshank(hlk(:,ir),jlk(:,ir),ek*rmesh(ir),lmax) + if (nsra==2) then + call beshank_smallcomp(hlk(:,ir),jlk(:,ir),& + ek*rmesh(ir),rmesh(ir),eryd,lmax) + end if -!INTEGER, PARAMETER :: lmaxd1= lmaxd+1 + do l1 = 1,nvec*(lmax+1) + hlk(l1,ir) = -ci*hlk(l1,ir) + end do -!INTEGER, PARAMETER :: lmmaxso=2*lmmaxd -!INTEGER :: lmpotd -!DOUBLE PRECISION, INTENT, PARAMETER :: lmpotd= (lpotd+1)**2 + if (nsra==1) then + do l1 = 1,nvec*(lmax+1) + jlk2(l1,ir) = jlk(l1,ir) + hlk2(l1,ir) = hlk(l1,ir) + end do + else if (nsra==2) then + do l1 = 1,lmax+1 + jlk2(l1,ir) = jlk(l1,ir) + hlk2(l1,ir) = hlk(l1,ir) + end do + do l1 = lmax+2,2*(lmax+1) + jlk2(l1,ir) = -jlk(l1,ir) + hlk2(l1,ir) = -hlk(l1,ir) + end do + end if -!INTEGER, PARAMETER :: lmxspd= (2*lpotd+1)**2 +end do +gmatprefactor=ek2 +end subroutine rllsllsourceterms -DOUBLE PRECISION, PARAMETER :: cvlight=274.0720442D0 -DOUBLE COMPLEX, PARAMETER :: czero=(0D0,0D0) -DOUBLE COMPLEX, PARAMETER :: cone=(1D0,0D0) +subroutine getCLambdaCinv(Ncheb,CLambdaCinv) +implicit none +! set up the Lambda matrix which differentiates the coefficients of an +! Chebyshev expansion +integer :: Ncheb +double precision :: CLambdaCinv(0:Ncheb,0:Ncheb) +!local +double precision :: Lambda(0:Ncheb,0:Ncheb) +double precision :: Cmatrix(0:Ncheb,0:Ncheb) +double precision :: Cinvmatrix(0:Ncheb,0:Ncheb) +double precision :: temp1(0:Ncheb,0:Ncheb) +EXTERNAL dgemm +integer n + Lambda=(0.0D0,0.0D0) + Cmatrix=(0.0D0,0.0D0) + Cinvmatrix=(0.0D0,0.0D0) + Lambda=(0.0D0,0.0D0) + temp1=(0.0D0,0.0D0) -!INTEGER, PARAMETER :: nrmaxd=ntotd*(nchebd+1) +call getLambda(Ncheb,Lambda) +call getCinvmatrix(Ncheb,Cinvmatrix) +call getCmatrix(Ncheb,Cmatrix) +n=Ncheb+1 + call dgemm('N','N',n,n,n,1d0,Lambda,n,Cinvmatrix,n,0d0,temp1,n) + call dgemm('N','N',n,n,n,1d0,Cmatrix,n,temp1,n,0d0,CLambdaCinv,n) +! temp1=matmat_dmdm(Lambda,Cinvmatrix,Ncheb) +! CLambdaCinv=matmat_dmdm(Cmatrix,temp1,Ncheb) -INTEGER :: lmmaxd, lmaxd1, lmmaxso, lmpotd, lmxspd, nrmaxd -DOUBLE COMPLEX eryd, ek,df +end subroutine - -DOUBLE COMPLEX, allocatable :: tmatll(:,:), & - tmattemp(:,:) -DOUBLE COMPLEX, allocatable :: gmatll(:,:,:), gmat0(:,:) -INTEGER :: ir,use_sratrick,nvec,lm1,lm2,ie,irmdnew,imt1, & - jspin,idim,iorb -DOUBLE PRECISION :: pi,thetanew,phinew -DOUBLE COMPLEX gmatprefactor -DOUBLE PRECISION, allocatable :: vins(:,:,:) -DOUBLE COMPLEX,allocatable :: vnspll0(:,:,:),vnspll1(:,:,:,:), vnspll(:,:,:,:) -DOUBLE COMPLEX, allocatable :: hlk(:,:,:),jlk(:,:,:), hlk2(:,:,:),jlk2(:,:,:) -DOUBLE COMPLEX, allocatable :: rll(:,:,:,:), & - rllleft(:,:,:,:),sllleft(:,:,:,:) -DOUBLE COMPLEX, allocatable :: tmatsph(:,:) -DOUBLE COMPLEX, allocatable :: cden(:,:,:,:), & - cdenlm(:,:,:,:),cdenns(:,:,:),rho2nsc(:,:,:),r2nefc(:,:,:), & - rho2nsnew(:,:,:),r2nefnew(:,:,:),r2orbc(:,:,:,:), & - gflle_part(:,:,:),gflle(:,:,:,:),rho2nsc_loop(:,:,:,:), r2nefc_loop(:,:,:,:) +subroutine rotatematrix(mat,theta,phi,lmmax,mode) +! rotates a matrix in the local frame pointing in +! the direction of phi and theta to the global frame +implicit none +!interface +double complex,intent(inout) :: mat(2*lmmax,2*lmmax) +double precision,intent(in) :: phi +double precision,intent(in) :: theta +integer :: lmmax +integer :: mode +!local +double complex :: Umat(2*lmmax,2*lmmax) +double complex :: Udeggamat(2*lmmax,2*lmmax) +double complex :: mattemp(2*lmmax,2*lmmax) +!double precision :: matmat_zmzm -DOUBLE COMPLEX, allocatable:: den(:,:,:,:),denlm(:,:,:,:) -DOUBLE COMPLEX rho2(4),rho2int(4),temp1 +!*********************************************************************** +! create the rotation matrix: +! | cos(theta/2) exp(-i/2 phi) -sin(theta/2) exp(-i/2 phi) | +! U= | | +! | sin(theta/2) exp( i/2 phi) cos(theta/2) exp( i/2 phi) | +! +! Udegga = transpose(complex conjug ( U ) ) +!*********************************************************************** -DOUBLE COMPLEX rho2ns_temp(2,2),dentemp -DOUBLE PRECISION :: moment(3),totmoment,totxymoment -DOUBLE PRECISION :: denorbmom(3),denorbmomsp(2,4), & - denorbmomlm(0:lmaxd,3),denorbmomns(3) -DOUBLE COMPLEX, allocatable :: cdentemp(:,:), rhotemp(:,:),rhonewtemp(:,:) -INTEGER, allocatable :: jlk_index(:) -LOGICAL :: test,opt -EXTERNAL test,opt -!DOUBLE PRECISION :: qvec(:,:) ! qdos ruess: q-vectors for qdos -!allocatable qvec ! qdos ruess -!DOUBLE COMPLEX dentot(2) ! qdos ruess -!DOUBLE COMPLEX, allocatable :: dentmp(:,:) ! qdos ruess -INTEGER :: iq,nqdos ! qdos ruess: number of qdos points -!INTEGER :: m1,lmshift1(4),lmshift2(4) !, ix ! qdos ruess -!INTEGER :: lrecgflle,ierr ! lmlm-dos -! OMP - number of threads, thread id -INTEGER :: nth,ith +call create_Umatrix(theta,phi,lmmax,Umat,Udeggamat) +!*********************************************************************** +! calculate matrix in the global frame: +! +! t_glob = U * t_loc * Udegga +!*********************************************************************** -lmmaxd = (lmaxd+1)**2 -lmaxd1 = lmaxd+1 -lmmaxso = 2*lmmaxd -lmpotd = (lpotd+1)**2 -lmxspd = (2*lpotd+1)**2 -nrmaxd=irmd_new -allocate(tmatll(lmmaxso,lmmaxso)) -allocate(tmattemp(lmmaxso,lmmaxso)) -allocate(gmatll(lmmaxso,lmmaxso,iemxd)) -allocate(gmat0(lmmaxso,lmmaxso)) -!allocate(dentmp(0:lmaxd1,2)) -allocate(jlk_index(2*lmmaxso)) +if (mode==0) then ! 'loc->glob' + call zgemm('N','N',2*lmmax,2*lmmax,2*lmmax,(1d0,0d0),mat,2*lmmax,Udeggamat,2*lmmax,(0d0,0d0),mattemp,2*lmmax) + call zgemm('N','N',2*lmmax,2*lmmax,2*lmmax,(1d0,0d0),Umat,2*lmmax,mattemp,2*lmmax,(0d0,0d0),mat,2*lmmax) +elseif (mode==1) then !'glob->loc' + call zgemm('N','N',2*lmmax,2*lmmax,2*lmmax,(1d0,0d0),mat,2*lmmax,Umat,2*lmmax,(0d0,0d0),mattemp,2*lmmax) + call zgemm('N','N',2*lmmax,2*lmmax,2*lmmax,(1d0,0d0),Udeggamat,2*lmmax,mattemp,2*lmmax,(0d0,0d0),mat,2*lmmax) +else + stop '[rotatematrix] mode not known' +end if +! writE(324,'(5000F)') tmat +! stop +end subroutine rotatematrix -! determine if omp is used - ith = 0 - nth = 1 -#ifdef CPP_OMP -!$omp parallel shared(nth,ith) -!$omp single - nth = omp_get_num_threads() -!$omp end single -!$omp end parallel -#endif -pi=4D0*DATAN(1D0) -irmdnew= npan_tot*(ncheb+1) -imt1=ipan_intervall(npan_log+npan_eq)+1 -allocate(vins(irmdnew,lmpotd,nspin)) -vins=0D0 -DO lm1=1,lmpotd - DO ir=1,irmdnew - vins(ir,lm1,1)=vinsnew(ir,lm1,ipot) - vins(ir,lm1,nspin)=vinsnew(ir,lm1,ipot+nspin-1) - END DO -END DO +SUBROUTINE spin_orbit_compl(lmax,lmmaxd,l_s) -!c set up the non-spherical ll' matrix for potential VLL' -IF (NSRA.EQ.2) THEN -USE_SRATRICK=1 -ELSE -USE_SRATRICK=0 -ENDIF -allocate(vnspll0(lmmaxso,lmmaxso,irmdnew)) -allocate(vnspll1(lmmaxso,lmmaxso,irmdnew,0:nth-1)) -vnspll0=czero -CALL vllmat(1,irmdnew,lmmaxd,lmmaxso,vnspll0,vins, & - cleb,icleb,iend,nspin,zat,rnew,use_sratrick) +IMPLICIT NONE -! initial allocate -IF (nsra == 2) THEN - allocate(vnspll(2*lmmaxso,2*lmmaxso,irmdnew,0:nth-1)) -ELSE - allocate(vnspll(lmmaxso,lmmaxso,irmdnew,0:nth-1)) -END IF +INTEGER, INTENT(IN) :: lmax +INTEGER, INTENT(IN) :: lmmaxd +DOUBLE COMPLEX, INTENT(OUT):: l_s(:,:) +! ************************************************************************ +! in this subroutine the matrix L*S is calculated for the basis of +! real spherical harmonics -allocate(hlk(4*(lmax+1),irmdnew,0:nth-1)) -allocate(jlk(4*(lmax+1),irmdnew,0:nth-1)) -allocate(hlk2(4*(lmax+1),irmdnew,0:nth-1)) -allocate(jlk2(4*(lmax+1),irmdnew,0:nth-1)) -allocate(tmatsph(2*(lmax+1),0:nth-1)) -allocate(rll(nsra*lmmaxso,lmmaxso,irmdnew,0:nth-1)) -allocate(rllleft(nsra*lmmaxso,lmmaxso,irmdnew,0:nth-1)) -allocate(sllleft(nsra*lmmaxso,lmmaxso,irmdnew,0:nth-1)) -allocate(cden(irmdnew,0:lmaxd,4,0:nth-1)) -allocate(cdenlm(irmdnew,lmmaxd,4,0:nth-1)) -allocate(cdenns(irmdnew,4,0:nth-1)) -allocate(rho2nsc(irmdnew,lmpotd,4)) -allocate(rho2nsc_loop(irmdnew,lmpotd,4,ielast)) -allocate(rho2nsnew(irmd,lmpotd,4)) -allocate(r2nefc(irmdnew,lmpotd,4)) -allocate(r2nefc_loop(irmdnew,lmpotd,4,0:nth-1)) -allocate(r2nefnew(irmd,lmpotd,4)) -allocate(r2orbc(irmdnew,lmpotd,4,0:nth-1)) -allocate(cdentemp(irmdnew,0:nth-1)) -allocate(gflle_part(lmmaxso,lmmaxso,0:nth-1)) -allocate(gflle(lmmaxso,lmmaxso,ielast,1)) -allocate(den(0:lmaxd1,iemxd,2,1),denlm(lmmaxd,iemxd,2,1)) -rho2nsc=czero -rho2nsc_loop=czero -r2nefc=czero -r2nefc_loop=czero -r2orbc=czero -rho2ns=0.d0 ! fivos 19.7.2014, this was CZERO -r2nef=0.d0 ! fivos 19.7.2014, this was CZERO -rho2nsnew=czero -r2nefnew=czero -den=czero -espv=0D0 -rho2int=czero -denorbmom=0D0 -denorbmomsp=0D0 -denorbmomlm=0D0 -denorbmomns=0D0 -thetanew=0D0 -phinew=0D0 -gflle_part=czero -gflle=czero -! LM shifts for correct density summation -!lmshift1(1)=0 ! qdos ruess -!lmshift1(2)=lmmaxd ! qdos ruess -!lmshift1(3)=0 ! qdos ruess -!lmshift1(4)=lmmaxd ! qdos ruess -!lmshift2(1)=0 ! qdos ruess -!lmshift2(2)=lmmaxd ! qdos ruess -!lmshift2(3)=lmmaxd ! qdos ruess -!lmshift2(4)=0 ! qdos ruess -GMAT0 = czero -gmatll = czero +! local variableINTEGER :: i1,i2,i1l,rl,lm1,lm2 +INTEGER :: rl,lm1,lm2 +DOUBLE COMPLEX,allocatable :: ls_l(:,:) -DO ir=1,3 - DO lm1=0,lmaxd1+1 - muorb(lm1,ir)=0D0 - END DO -END DO - nqdos = 1 ! qdos ruess -!IF (opt('qdos ')) THEN ! qdos ruess -! Read BZ path for qdos calculation: ! qdos ruess -! OPEN(67,FILE='qvec.dat',STATUS='old',IOSTAT=ierr,ERR=3000) ! qdos ruess -! READ(67,*) nqdos ! qdos ruess -! allocate(qvec(3,nqdos)) ! qdos ruess -! DO iq = 1,nqdos ! qdos ruess -! READ(67,*) (qvec(ix,iq),ix=1,3) ! qdos ruess -! END DO ! qdos ruess -! CLOSE(67) ! qdos ruess -! Change allocation for GFLLE to be suitabel for qdos run ! qdos ruess -! deallocate(gflle,den,denlm) ! qdos ruess -! allocate(gflle(lmmaxso,lmmaxso,ielast,nqdos)) ! qdos ruess -! allocate(den(0:lmaxd1,iemxd,2,nqdos), denlm(lmmaxd,iemxd,2,nqdos)) -! 3000 IF (ierr /= 0) STOP 'ERROR READING ''QVEC.DAT''' ! QDOS Ruess -!END IF ! OPT('qdos ') ! qdos ruess - -!IF ((opt('lmlm-dos')).AND.(i1 == 1)) THEN ! lmlm-dos ruess -! lrecgflle = 4*lmmaxso*lmmaxso*ielast*nqdos ! lmlm-dos ruess -! OPEN(91,ACCESS='direct',RECL=lrecgflle,FILE='gflle', ! lmlm-dos ruess & -! FORM='unformatted',STATUS='replace',ERR=3001,IOSTAT=ierr)! lmlm-dos ruess -! 3001 IF (ierr /= 0) STOP 'ERROR CREATING ''GFLLE''' ! LMLM-DOs ruess -!END IF ! lmlm-dos ruess - -! energy loop -!WRITE(6,*) 'atom: ',i1 - - -#ifdef CPP_OMP -! omp: start parallel region here -!$omp parallel do default(none) ,& -!$omp& private(eryd,ie,ir,lm1,lm2,gmatprefactor,nvec) ,& -!$omp& private(jlk_index,tmatll,ith) ,& -!$omp& shared(nspin,nsra,iend,ipot,ielast,npan_tot,ncheb,lmax) ,& -!$omp& shared(zat,socscale,ez,rmesh,cleb,rnew,nth,icleb,thetasnew) ,& -!$omp& shared(rpan_intervall,vinsnew,ipan_intervall,r2nefc_loop) ,& -!$omp& shared(use_sratrick,irmdnew,theta,phi,vins,vnspll0) ,& -!$omp& shared(vnspll1,vnspll,hlk,jlk,hlk2,jlk2,rll,cdentemp) ,& -!$omp& shared(tmatsph,den,denlm,gflle,gflle_part,rllleft,sllleft) ,& -!$omp& private(iq,df,ek,tmattemp,gmatll,gmat0,iorb,dentemp) ,& -!$omp& private(rho2ns_temp,rho2,temp1,jspin) ,& -!$omp& shared(ldorhoef,nqdos,wez,lmsp,imt1,ifunm) ,& -!$omp& shared(r2orbc,r2nefc,cden,cdenlm,cdenns,rho2nsc_loop) ,& -!$omp& shared(lmaxd,lmaxd1,lmmaxd,lmpotd,nrmaxd,soc,lmmaxso,gmatn) ,& -!$omp& reduction(+:rho2int,espv) reduction(-:muorb) ,& -!$omp& reduction(-:denorbmom,denorbmomsp,denorbmomlm,denorbmomns) -#endif +!icompl=(0D0,1D0) -DO ie=1,ielast -#ifdef CPP_OMP - ith = omp_get_thread_num() -#else - ith = 0 -#endif - - eryd=ez(ie) - ek=SQRT(eryd) - df=wez(ie)/DBLE(nspin) - IF (nsra == 2) ek = SQRT( eryd + eryd*eryd/(cvlight*cvlight) ) * & - ( 1D0 + eryd/(cvlight*cvlight) ) -!!$noomp critical -! WRITE(6,*) 'energy:',ie,'',eryd -!!$noomp end critical -! -! IREC=IE+IELAST*(I1-1) -! READ(69,REC=IREC) GMAT0 -! -! rotate gmat from global frame to local frame - -! GMAT0 = gmatn(:,:,ie) -! CALL ROTATEMATRIX(GMAT0,THETA,PHI,LMMAXD,1) - -! DO LM1=1,LMMAXSO -! DO LM2=1,LMMAXSO -! GMATLL(LM1,LM2,IE)=GMAT0(LM1,LM2) -! ENDDO -! ENDDO - -! recalculate wavefuntions, also include left solution -! contruct the spin-orbit coupling hamiltonian and add to potential - CALL spinorbit_ham(lmax,lmmaxd,vins,rnew, & - eryd,zat,cvlight,socscale,nspin,lmpotd, & - theta,phi,ipan_intervall,rpan_intervall, npan_tot,ncheb,irmdnew,nrmaxd, & - vnspll0,vnspll1(:,:,:,ith),'1',soc) - -!c extend matrix for the SRA treatment - vnspll(:,:,:,ith)=czero - IF (nsra == 2) THEN - IF (use_sratrick == 0) THEN - CALL vllmatsra(vnspll1(:,:,:,ith),vnspll(:,:,:,ith),rnew, & - lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=0') - ELSE IF (use_sratrick == 1) THEN - CALL vllmatsra(vnspll1(:,:,:,ith),vnspll(:,:,:,ith),rnew, & - lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=Vsph') - END IF - ELSE - vnspll(:,:,:,ith)=vnspll1(:,:,:,ith) - END IF - -!c calculate the source terms in the Lippmann-Schwinger equation -!c these are spherical hankel and bessel functions - hlk(:,:,ith)=czero - jlk(:,:,ith)=czero - hlk2(:,:,ith)=czero - jlk2(:,:,ith)=czero - gmatprefactor=czero - jlk_index=0 - CALL rllsllsourceterms(nsra,nvec,eryd,rnew,irmdnew,nrmaxd,lmax, & - lmmaxso,1,jlk_index,hlk(:,:,ith), & - jlk(:,:,ith),hlk2(:,:,ith),jlk2(:,:,ith), gmatprefactor) - -! using spherical potential as reference - IF (use_sratrick == 1) THEN - CALL calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,zat,cvlight,eryd, & - rnew,vins,ncheb,npan_tot,rpan_intervall, & - jlk_index,hlk(:,:,ith),jlk(:,:,ith),hlk2(:,:,ith), & - jlk2(:,:,ith),gmatprefactor,tmatsph(:,ith), use_sratrick) - END IF +CALL cinit((2*lmmaxd)**2,l_s) + +DO rl=0,lmax -!c calculate the tmat and wavefunctions - rllleft(:,:,:,ith)=czero - sllleft(:,:,:,ith)=czero + allocate(ls_l((2*rl+1)*2,(2*rl+1)*2)) + CALL cinit(((2*rl+1)*2)**2,ls_l) -!c right solutions - tmatll=czero - CALL rll_only(rpan_intervall,rnew,vnspll(:,:,:,ith), & - rll(:,:,:,ith),tmatll, & - ncheb,npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1), & - irmdnew,nsra,jlk_index,hlk(:,:,ith),jlk(:,:,ith), & - hlk2(:,:,ith),jlk2(:,:,ith), gmatprefactor,'1','1',use_sratrick) - IF (nsra == 2) THEN - rll(lmmaxso+1:nvec*lmmaxso,:,:,ith)= & - rll(lmmaxso+1:nvec*lmmaxso,:,:,ith)/cvlight - END IF -! left solutions -! contruct the TRANSPOSE spin-orbit coupling hamiltonian and add to potential - CALL spinorbit_ham(lmax,lmmaxd,vins,rnew,eryd,zat, & - cvlight,socscale,nspin,lmpotd,theta,phi, & - ipan_intervall,rpan_intervall,npan_tot,ncheb, & - irmdnew,nrmaxd,vnspll0,vnspll1(:,:,:,ith), 'transpose',soc) + CALL spin_orbit_one_l(rl,ls_l) -!c extend matrix for the SRA treatment - vnspll(:,:,:,ith)=czero - IF (nsra == 2) THEN - IF (use_sratrick == 0) THEN - CALL vllmatsra(vnspll1(:,:,:,ith),vnspll(:,:,:,ith),rnew, & - lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=0') - ELSE IF (use_sratrick == 1) THEN - CALL vllmatsra(vnspll1(:,:,:,ith),vnspll(:,:,:,ith),rnew, & - lmmaxso,irmdnew,nrmaxd,eryd,cvlight,lmax,0,'Ref=Vsph') + DO lm1=1,(2*rl+1)*2 + + IF (lm1 <= 2*rl+1 ) THEN + DO lm2=1,(2*rl+1) + l_s(rl**2+lm1,rl**2+lm2)=0.5D0*ls_l(lm1,lm2) + END DO + DO lm2=(2*rl+1)+1,(2*rl+1)*2 + l_s(rl**2+lm1,lmmaxd+rl**2-(2*rl+1)+lm2)= 0.5D0*ls_l(lm1,lm2) + END DO + ELSE + DO lm2=1,(2*rl+1) + l_s(lmmaxd+rl**2-(2*rl+1)+lm1,rl**2+lm2)= 0.5D0*ls_l(lm1,lm2) + END DO + DO lm2=(2*rl+1)+1,(2*rl+1)*2 + l_s(lmmaxd+rl**2-(2*rl+1)+lm1,lmmaxd+rl**2-(2*rl+1)+lm2)= & + 0.5D0*ls_l(lm1,lm2) + END DO END IF - ELSE - vnspll(:,:,:,ith)=vnspll1(:,:,:,ith) - END IF - -!c calculate the source terms in the Lippmann-Schwinger equation -!c these are spherical hankel and bessel functions - hlk(:,:,ith)=czero - jlk(:,:,ith)=czero - hlk2(:,:,ith)=czero - jlk2(:,:,ith)=czero - gmatprefactor=czero - jlk_index=0 - CALL rllsllsourceterms(nsra,nvec,eryd,rnew,irmdnew,nrmaxd,lmax, & - lmmaxso,1,jlk_index,hlk(:,:,ith), & - jlk(:,:,ith),hlk2(:,:,ith),jlk2(:,:,ith), gmatprefactor) - -!c using spherical potential as reference -! notice that exchange the order of left and right hankel/bessel functions - IF (use_sratrick == 1) THEN - CALL calcsph(nsra,irmdnew,nrmaxd,lmax,nspin,zat,cvlight,eryd, & - rnew,vins,ncheb,npan_tot,rpan_intervall, & - jlk_index,hlk2(:,:,ith),jlk2(:,:,ith), & - hlk(:,:,ith),jlk(:,:,ith),gmatprefactor, tmatsph(:,ith),use_sratrick) - END IF + + END DO !lm1 -!c calculate the tmat and wavefunctions - rllleft(:,:,:,ith)=czero - sllleft(:,:,:,ith)=czero + deallocate(ls_l) -!c left solutions -! notice that exchange the order of left and right hankel/bessel functions - tmattemp=czero - CALL rllsll(rpan_intervall,rnew,vnspll(:,:,:,ith), & - rllleft(:,:,:,ith),sllleft(:,:,:,ith),tmattemp, & - ncheb,npan_tot,lmmaxso,nvec*lmmaxso,4*(lmax+1), & - irmdnew,nsra,jlk_index,hlk2(:,:,ith),jlk2(:,:,ith), & - hlk(:,:,ith),jlk(:,:,ith), gmatprefactor,'1','1',use_sratrick) - IF (nsra == 2) THEN - rllleft(lmmaxso+1:nvec*lmmaxso,:,:,ith)= & - rllleft(lmmaxso+1:nvec*lmmaxso,:,:,ith)/cvlight - sllleft(lmmaxso+1:nvec*lmmaxso,:,:,ith)= & - sllleft(lmmaxso+1:nvec*lmmaxso,:,:,ith)/cvlight - END IF - DO iq = 1,nqdos ! qdos - den(:,ie,:,iq)=czero -! read in gf -! irec = iq + nqdos * (ie-1) + nqdos * ielast * (i1-1) ! qdos -!!$noomp critical -! READ(69,REC=irec) gmat0 -!!$noomp end critical - - GMAT0 = gmatn(:,:,ie) -! rotate gmat from global frame to local frame - CALL rotatematrix(gmat0,theta,phi,lmmaxd,1) - - DO lm1=1,lmmaxso - DO lm2=1,lmmaxso - gmatll(lm1,lm2,ie)=gmat0(lm1,lm2) - END DO +END DO !rl=0,lmax + + +END SUBROUTINE spin_orbit_compl + + +SUBROUTINE beshank(hl,jl,z,lmax) + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-19 Time: 12:22:05 + +!----------------------------------------------------------------------- +! calculates spherical bessel, hankel and neumann functions +! for the orders lmin .le. l .le. lmax. +! For |z| .lt. l+1 the taylor expansions of jl and nl are used. +! For |z| .ge. l+1 the explicit expressions for hl(+), hl(-) are used. +!----------------------------------------------------------------------- +! .. Parameters .. +DOUBLE COMPLEX ci +PARAMETER (ci= (0.0D0,1.0D0)) +! .. +! .. Scalar Arguments .. +DOUBLE COMPLEX z +INTEGER :: lmax +! .. +! .. Array Arguments .. +DOUBLE COMPLEX hl(0:lmax),jl(0:lmax),nl(0:lmax) +! .. +! .. Local Scalars .. +DOUBLE COMPLEX termj,termn,z2,zj,zn +DOUBLE PRECISION :: rl,rn,rnm +INTEGER :: l,m,n +! .. +! .. Intrinsic Functions .. +INTRINSIC CDABS,EXP +! .. +zj = 1.d0 +zn = 1.d0 +z2 = z*z +IF (CDABS(z) < lmax+1.d0) THEN + DO l = 0,lmax + rl = l + l + termj = -0.5D0/ (rl+3.d0)*z2 + termn = 0.5D0/ (rl-1.d0)*z2 + jl(l) = 1.d0 + nl(l) = 1.d0 + DO n = 2,25 + jl(l) = jl(l) + termj + nl(l) = nl(l) + termn + rn = n + n + termj = -termj/ (rl+rn+1.d0)/rn*z2 + termn = termn/ (rl-rn+1.d0)/rn*z2 END DO -! calculate density - CALL rhooutnew(nsra,lmmaxd,lmmaxso,lmax,gmatll(:,:,ie),ek, & - df,cleb,icleb,iend, & - irmdnew,thetasnew,ifunm,imt1,lmsp, & - rll(:,:,:,ith), rllleft(:,:,:,ith),sllleft(:,:,:,ith), & - cden(:,:,:,ith),cdenlm(:,:,:,ith), & - cdenns(:,:,ith),rho2nsc_loop(:,:,:,ie),0, & - lmaxd) - - DO jspin=1,4 - - DO lm1 = 0,lmax - cdentemp(:,ith)=czero - dentemp=czero - DO ir=1,irmdnew - cdentemp(ir,ith)=cden(ir,lm1,jspin,ith) - END DO - CALL intcheb_cell(cdentemp(:,ith),dentemp, & - rpan_intervall,ipan_intervall,npan_tot,ncheb,irmdnew) - rho2(jspin)=dentemp - rho2int(jspin)=rho2int(jspin)+rho2(jspin)*df - IF (jspin <= 2) THEN - den(lm1,ie,jspin,iq)=rho2(jspin) - END IF - END DO - - IF (jspin <= 2) THEN - DO lm1 = 1,lmmaxd - cdentemp(:,ith)=czero - dentemp=czero - DO ir=1,irmdnew - cdentemp(ir,ith)=cdenlm(ir,lm1,jspin,ith) - END DO - CALL intcheb_cell(cdentemp(:,ith),dentemp, & - rpan_intervall,ipan_intervall,npan_tot,ncheb,irmdnew) - denlm(lm1,ie,jspin,iq)=dentemp - END DO - cdentemp(:,ith)=czero - dentemp=czero - DO ir=1,irmdnew - cdentemp(ir,ith)=cdenns(ir,jspin,ith) - END DO - CALL intcheb_cell(cdentemp(:,ith),dentemp, & - rpan_intervall,ipan_intervall,npan_tot,ncheb,irmdnew) - den(lmaxd1,ie,jspin,iq)=dentemp - rho2int(jspin)=rho2int(jspin)+den(lmaxd1,ie,jspin,iq)*df - END IF - END DO ! JSPIN + jl(l) = jl(l)*zj + nl(l) = -nl(l)*zn/z + hl(l) = jl(l) + nl(l)*ci - DO jspin=1,4 - IF (jspin <= 2) THEN - DO lm1=0,lmaxd1 - espv(lm1,jspin)=espv(lm1,jspin)+ & - DIMAG( eryd * den(lm1,ie,jspin,iq) * df ) - END DO - END IF + zj = zj*z/ (rl+3.d0) + zn = zn/z* (rl+1.d0) + END DO +END IF + +DO l = 0,lmax + IF (CDABS(z) >= l+1.d0) THEN + hl(l) = 0.d0 + nl(l) = 0.d0 + rnm = 1.d0 + DO m = 0,l + hl(l) = hl(l) + rnm/ (-ci* (z+z))**m + nl(l) = nl(l) + rnm/ (ci* (z+z))**m + rnm = rnm* (l*l+l-m*m-m)/ (m+1.d0) END DO - END DO ! IQ = 1,NQDOS -!END DO + hl(l) = hl(l)* (-ci)**l*EXP(ci*z)/ (ci*z) + nl(l) = nl(l)*ci**l*EXP(-ci*z)/ (-ci*z) + jl(l) = (hl(l)+nl(l))*0.5D0 + nl(l) = (hl(l)-jl(l))/ci + END IF +END DO -! get charge at the Fermi energy (IELAST) +RETURN -IF (ie == ielast.AND.ldorhoef) THEN - CALL rhooutnew(nsra,lmmaxd,lmmaxso,lmax,gmatll(:,:,ie),ek, & - cone,cleb,icleb,iend, & - irmdnew,thetasnew,ifunm,imt1,lmsp, & - rll(:,:,:,ith), rllleft(:,:,:,ith),sllleft(:,:,:,ith), & - cden(:,:,:,ith),cdenlm(:,:,:,ith), & - cdenns(:,:,ith),r2nefc_loop(:,:,:,ith),0, & - lmaxd) -END IF +END SUBROUTINE +SUBROUTINE beshank_smallcomp(hl,jl,zval,tau,eryd,lmax) +IMPLICIT NONE +!----------------------------------------------------------------------- +! takes the spherical bessel etc functions stored in an array up to LMAX +! array entries from LMAX+1 to 2*LMAX are assumed to be empty +! these values are filled with the potential-free solution of the +! SRA-equations +!----------------------------------------------------------------------- +DOUBLE COMPLEX hl(0:2*(lmax+1)-1), jl(0:2*(lmax+1)-1), & + nl(0:2*(lmax+1)-1) +DOUBLE PRECISION :: cvlight +PARAMETER (cvlight=274.0720442D0) +DOUBLE COMPLEX zval +DOUBLE COMPLEX eryd +DOUBLE PRECISION :: tau +INTEGER :: lmax -! get orbital moment -DO iorb=1,3 - CALL rhooutnew(nsra,lmmaxd,lmmaxso,lmax,gmatll(:,:,ie),ek, & - cone,cleb,icleb,iend, & - irmdnew,thetasnew,ifunm,imt1,lmsp, & - rll(:,:,:,ith), rllleft(:,:,:,ith),sllleft(:,:,:,ith), & - cden(:,:,:,ith),cdenlm(:,:,:,ith), & - cdenns(:,:,ith),r2orbc(:,:,:,ith),iorb, & - lmaxd) - DO jspin=1,4 - IF (jspin <= 2) THEN - DO lm1=0,lmax - cdentemp(:,ith)=czero - dentemp=czero - DO ir=1,irmdnew - cdentemp(ir,ith)=cden(ir,lm1,jspin,ith) - END DO - CALL intcheb_cell(cdentemp(:,ith),dentemp,rpan_intervall, & - ipan_intervall,npan_tot,ncheb,irmdnew) - rho2(jspin)=dentemp - muorb(lm1,jspin)=muorb(lm1,jspin)-DIMAG(rho2(jspin)*df) - denorbmom(iorb)=denorbmom(iorb)-DIMAG(rho2(jspin)*df) - denorbmomsp(jspin,iorb)=denorbmomsp(jspin,iorb)- DIMAG(rho2(jspin)*df) - denorbmomlm(lm1,iorb)=denorbmomlm(lm1,iorb)- DIMAG(rho2(jspin)*df) - cdentemp(:,ith)=czero - DO ir=1,irmdnew - cdentemp(ir,ith)=cdenns(ir,jspin,ith) - END DO - CALL intcheb_cell(cdentemp(:,ith),temp1, & - rpan_intervall,ipan_intervall,npan_tot,ncheb,irmdnew) - denorbmomns(iorb)=denorbmomns(iorb)-DIMAG(temp1*df) - END DO - END IF - END DO -END DO ! IORB -END DO ! IE loop +! DOUBLE PRECISION CVLIGHT +DOUBLE COMPLEX prefac +INTEGER :: il,il2 -#ifdef CPP_OMP -!$omp end parallel do -#endif -! omp: move sum from rhooutnew here after parallel calculation -DO ir=1,irmdnew - DO lm1=1,lmpotd - DO jspin=1,4 - DO ie=1,ielast - rho2nsc(ir,lm1,jspin) = rho2nsc(ir,lm1,jspin) + & - rho2nsc_loop(ir,lm1,jspin,ie) - END DO - END DO - END DO -END DO -! omp: don't forget to do the same with density at fermi energy: -DO ith=0,nth-1 - r2nefc(:,:,:) = r2nefc(:,:,:) + r2nefc_loop(:,:,:,ith) + +prefac = 1.0D0 / (1.0D0+eryd/cvlight**2) / tau !/cvlight !last cvlight for small component test + +il=0 +il2=il+lmax+1 +nl(il2)=prefac * (zval* (-nl(il+1)) ) +jl(il2)=prefac * (zval* (-jl(il+1)) ) +! HL(IL2)=JL(IL2)+ CI*NL(IL2) +hl(il2)=prefac * (zval* (-hl(il+1)) ) +! write(*,'(5000E)') tau,HL(IL2),JL(IL2)+ (0.0D0,1.0D0)*NL(IL2) +! write(*,'(5000E)') tau,HL(0),JL(0)+ (0.0D0,1.0D0)*NL(0) + +prefac = 1.0D0 / (1.0D0+eryd/cvlight**2) / tau !/cvlight !last cvlight for small component test + +DO il=1,lmax + il2=il+lmax+1 + nl(il2)=prefac * ( zval * nl(il-1)-(il+1)*nl(il) ) + jl(il2)=prefac * ( zval * jl(il-1)-(il+1)*jl(il) ) +! HL(IL2)=JL(IL2)+ CI*NL(IL2) + hl(il2)=prefac * ( zval * hl(il-1)-(il+1)*hl(il) ) +! HL(IL2)=PREFAC * ( ZVAL * HL(IL-1)-(IL+1)*HL(IL) ) +! write(*,'(5000E)') tau,HL(IL2),JL(IL2)+ (0.0D0,1.0D0)*NL(IL2) END DO -! omp: moved write-out of dos files out of parallel energy loop -! Write out qdos and lm-dos: ! lm-dos -!DO ie=1,ielast ! lm-dos -! DO iq=1,nqdos ! lm-dos -! IF ((iq == 1).AND.(ie == 1)) THEN ! lm-dos -! OPEN(29, ! lm-dos & -! FILE="lmdos."//CHAR(48+i1/10)//CHAR(48+MOD(i1,10))//"."// ! lm-dos & -! CHAR(48+1)//".dat") ! lm-dos -! WRITE (29,*) ' ' ! lm-dos -! WRITE (29,8600) '# ISPIN=',1,' I1=',i1 ! lm-dos -! OPEN(30, ! lm-dos & -! FILE="lmdos."//CHAR(48+i1/10)//CHAR(48+MOD(i1,10))//"."// ! lm-dos & -! CHAR(48+2)//".dat") ! lm-dos -! WRITE (30,*) ' ' ! lm-dos -! WRITE (30,8600) '# ISPIN=',2,' I1=',i1 ! lm-dos -! END IF ! lm-dos - -! IF (opt('qdos ')) THEN ! qdos ruess -! IF ((iq == 1).AND.(ie == 1)) THEN ! qdos ruess -! OPEN(31, ! qdos ruess & -! FILE="qdos."//CHAR(48+i1/10)//CHAR(48+MOD(i1,10))//"."// ! qdos ruess & -! CHAR(48+1)//".dat") ! qdos ruess -! WRITE (31,*) ' ' ! qdos ruess -! WRITE (31,8600) '# ISPIN=',1,' I1=',i1 ! qdos ruess -! WRITE(31,'(7(A,3X))') '# Re(E)','Im(E)','k_x','k_y','k_z',! qdos & -! 'DEN_tot','DEN_s,p,...' ! qdos -! OPEN(32, ! qdos ruess & -! FILE="qdos."//CHAR(48+i1/10)//CHAR(48+MOD(i1,10))//"."// ! qdos ruess & -! CHAR(48+2)//".dat") ! qdos ruess -! WRITE (32,*) ' ' ! qdos ruess -! WRITE (32,8600) '# ISPIN=',2,' I1=',i1 ! qdos ruess -! WRITE(32,'(7A)') '# Re(E)','Im(E)','k_x','k_y','k_z', ! qdos & -! 'DEN_tot','DEN_s,p,...' ! qdos - -! 8600 FORMAT (a8,i3,a4,i5) ! qdos ruess -! END IF ! IQ.EQ.1 ! qdos ruess -! DO jspin =1,2 ! qdos ruess -! dentot(jspin) = DCMPLX(0.d0,0.d0) ! qdos ruess -! DO l1 = 0,lmaxd1 ! qdos ruess -! dentot(jspin) = dentot(jspin) + den(l1,ie,1,iq) ! qdos ruess -! END DO ! qdos ruess -! END DO ! qdos ruess -! write qdos.nn.s.dat ! qdos ruess -! and lmdos.nn.s.dat ! qdos ruess -! WRITE(29,9000) ez(ie),qvec(1,iq),qvec(2,iq),qvec(3,iq), ! qdos ruess & -! (-DIMAG(denlm(l1,ie,1,iq))/pi,l1=1,lmmaxd) ! qdos ruess -! WRITE(30,9000) ez(ie),qvec(1,iq),qvec(2,iq),qvec(3,iq), ! qdos ruess & -! (-DIMAG(denlm(l1,ie,2,iq))/pi,l1=1,lmmaxd) ! qdos ruess -! WRITE(31,9000) ez(ie),qvec(1,iq),qvec(2,iq),qvec(3,iq), ! qdos ruess & -! -DIMAG(dentot(1))/pi,(-DIMAG(den(l1,ie,1,iq))/pi,l1=0,lmaxd1)! qdos ruess -! WRITE(32,9000) ez(ie),qvec(1,iq),qvec(2,iq),qvec(3,iq), ! qdos ruess & -! -DIMAG(dentot(2))/pi,(-DIMAG(den(l1,ie,2,iq))/pi,l1=0,lmaxd1)! qdos ruess -! ELSE ! lm-dos -! WRITE(29,9001) ez(ie), ! lm-dos & -! (-DIMAG(denlm(l1,ie,1,iq))/pi,l1=1,lmmaxd) ! lm-dos -! WRITE(30,9001) ez(ie), ! lm-dos & -! (-DIMAG(denlm(l1,ie,2,iq))/pi,l1=1,lmmaxd) ! lm-dos -! 9001 FORMAT(30E12.4) ! lm-dos -! END IF ! OPT('qdos ') ! qdos ruess -! 9000 FORMAT(5F10.6,40E16.8) ! qdos ruess -! END DO !IQ -!END DO !IE - -! write -!IF (opt('lmlm-dos')) THEN ! lmlm-dos -! DO JSPIN = 1,2 ! lmlm-dos -! OPEN(90, ! lmlm-dos -! & FILE="lmlmdos."//char(48+I1/10)//char(48+mod(I1,10))//"."// ! lmlm-dos -! & char(48+JSPIN)//".dat") ! lmlm-dos -! DO IE = 1,IELAST ! lmlm-dos -! DO LM1 = 1,LMMAXD ! lmlm-dos -! IF (.NOT.(OPT('qdos '))) THEN ! qdos -! WRITE(90,1000) EZ(IE), ! lmlm-dos -! & (-DIMAG(GFLLE(LM1+LMSHIFT1(JSPIN), ! lmlm-dos -! & LM2+LMSHIFT2(JSPIN),IE,1))/PI,LM2 = 1,LMMAXD) ! lmlm-dos -! ELSE ! qdos -! DO IQ=1,NQDOS ! qdos -! WRITE(90,1000) EZ(IE),QVEC(1,IQ),QVEC(2,IQ), ! qdos -! & QVEC(3,IQ),(-DIMAG(GFLLE(LM1+ ! qdos -! & LMSHIFT1(JSPIN),LM2+LMSHIFT2(JSPIN), ! qdos -! & IE,IQ))/PI,LM2 = 1,LMMAXD) ! qdos -! ENDDO ! IQ=1,NQDOS ! qdos -! ENDIF ! qdos -! ENDDO ! lmlm-dos -! ENDDO !IE ! lmlm-dos -! CLOSE(90) ! lmlm-dos -! ENDDO !JSPIN ! lmlm-dos -! 1000 FORMAT(5F10.6,I3,40E16.8) ! lmlm-dos -! write gflle to file ! lmlm-dos -! WRITE(91,REC=i1) gflle ! lmlm-dos -!END IF ! lmlm-dos +END SUBROUTINE beshank_smallcomp -allocate(rhotemp(irmdnew,lmpotd)) -allocate(rhonewtemp(irws,lmpotd)) -DO jspin=1,4 - rhotemp=czero - rhonewtemp=czero - DO lm1=1,lmpotd - DO ir=1,irmdnew - rhotemp(ir,lm1)=rho2nsc(ir,lm1,jspin) - END DO +SUBROUTINE chebint(cslc1,csrc1,slc1sum,c1,n) + +! Code converted using TO_F90 by Alan Miller +! Date: 2016-04-19 Time: 14:23:20 + +!--------------------------------------------------------------------- +! this subroutine calculates the matrices for the Chebyshev integration +! as defined on page 141 and 142 of the article: +! Integral Equation Method for the Continuous Spectrum Radial +! Schroedinger Equation by R. A. Gonzales et al +! in Journal of computational physics 134, 134-149 (1997) + +! the matrix C is the discrete cosine transform matrix +! the matrix C1 is the inverse of C +! the matrix SL is the left spectral integration matrix +! the matrix SR is the right spectral integration matrix +! the matrix CSLC1 is the product of C, SL and C1 +! the matrix CSRC1 is the product of C, SR and C1 +!--------------------------------------------------------------------- +! .. Local Scalars .. +DOUBLE PRECISION :: pi +INTEGER :: j,k +! .. +! .. Local Arrays .. +DOUBLE PRECISION :: c(0:n,0:n),c1(0:n,0:n),s1(0:n,0:n),s2(0:n,0:n), & + sl(0:n,0:n),slc1(0:n,0:n),sr(0:n,0:n), src1(0:n,0:n) +! .. +! .. External Subroutines .. +EXTERNAL dgemm +! .. +! .. Intrinsic Functions .. +INTRINSIC ATAN,COS +! .. +! .. Array Arguments .. +DOUBLE PRECISION :: cslc1(0:n,0:n),csrc1(0:n,0:n),slc1sum(0:n) +! .. +! .. Scalar Arguments .. +INTEGER :: n +! .. +pi = 4.d0*ATAN(1.d0) +!--------------------------------------------------------------------- +! determine the discrete cosine transform matrix from the zeros of the +! Chebyshev polynomials +DO j = 0,n + DO k = 0,n + c(k,j) = COS(((2*k+1)*j*pi)/ (2* (n+1))) END DO - CALL cheb2oldgrid(irws,irmdnew,lmpotd,rmesh,ncheb,npan_tot, & - rpan_intervall,ipan_intervall, rhotemp,rhonewtemp,irmd) - DO lm1=1,lmpotd - DO ir=1,irws - rho2nsnew(ir,lm1,jspin)=rhonewtemp(ir,lm1) - END DO +END DO +!--------------------------------------------------------------------- +! determine the inverse of the discrete cosine transform matrix from +! the transpose of the discrete cosine transform matrix +DO j = 0,n + DO k = 0,n + c1(k,j) = c(j,k)*2.d0/ (n+1) END DO - - rhotemp=czero - rhonewtemp=czero - DO lm1=1,lmpotd - DO ir=1,irmdnew - rhotemp(ir,lm1)=r2nefc(ir,lm1,jspin) - END DO + c1(0,j) = c1(0,j)*0.5D0 +END DO +!--------------------------------------------------------------------- +! next to statements can be used to check the products CT*C and C1*C +CALL dgemm('T','N',n+1,n+1,n+1,1.d0,c,n+1,c,n+1,0.d0,sr,n+1) +CALL dgemm('N','N',n+1,n+1,n+1,1.d0,c1,n+1,c,n+1,0.d0,sr,n+1) +!--------------------------------------------------------------------- +! preparation of the left and right +! spectral integration matrices SL and SR +DO j = 0,n + DO k = 0,n + s1(k,j) = 0.0D0 + s2(k,j) = 0.0D0 END DO - CALL cheb2oldgrid(irws,irmdnew,lmpotd,rmesh,ncheb,npan_tot, & - rpan_intervall,ipan_intervall, rhotemp,rhonewtemp,irmd) - DO lm1=1,lmpotd - DO ir=1,irws - r2nefnew(ir,lm1,jspin)=rhonewtemp(ir,lm1) - END DO +END DO +DO j = 0,n + s1(0,j) = (-1.d0)** (j+1) + s1(j,j) = 1.d0 +END DO +DO j = 2,n - 1 + s2(j,j-1) = 0.5D0/j + s2(j,j+1) = -0.5D0/j +END DO +s2(n,n-1) = 0.5D0/n +s2(1,0) = 1.d0 +s2(1,2) = -0.5D0 +CALL dgemm('N','N',n+1,n+1,n+1,1.d0,s1,n+1,s2,n+1,0.d0,sl,n+1) +DO j = 0,n + DO k = 0,n + s1(k,j) = 0.0D0 END DO END DO -deallocate(rhotemp) -deallocate(rhonewtemp) -! calculate new THETA and PHI for non-colinear -!IF (.NOT.test('FIXMOM ')) THEN -if (angle_fixed == 0) then ! angle not fixed - rho2ns_temp(1,1)=rho2int(1) - rho2ns_temp(2,2)=rho2int(2) - rho2ns_temp(1,2)=rho2int(3) - rho2ns_temp(2,1)=rho2int(4) - - CALL rotatematrix(rho2ns_temp,theta,phi,1,0) - - rho2int(1)=rho2ns_temp(1,1) - rho2int(2)=rho2ns_temp(2,2) - rho2int(3)=rho2ns_temp(1,2) - rho2int(4)=rho2ns_temp(2,1) - - - moment(1)=DIMAG(rho2int(3)+rho2int(4)) - moment(2)=-REAL(rho2int(3)-rho2int(4)) - moment(3)=DIMAG(-rho2int(1)+rho2int(2)) +DO j = 0,n + s1(j,j) = -1.d0 + s1(0,j) = 1.d0 +END DO +CALL dgemm('N','N',n+1,n+1,n+1,1.d0,s1,n+1,s2,n+1,0.d0,sr,n+1) +!--------------------------------------------------------------------- +! determination of the products C*SL*C1 and C*SR*C1 +CALL dgemm('N','N',n+1,n+1,n+1,1.d0,sl,n+1,c1,n+1,0.d0,slc1,n+1) +CALL dgemm('N','N',n+1,n+1,n+1,1.d0,c,n+1,slc1,n+1,0.d0,cslc1,n+1) +CALL dgemm('N','N',n+1,n+1,n+1,1.d0,sr,n+1,c1,n+1,0.d0,src1,n+1) +CALL dgemm('N','N',n+1,n+1,n+1,1.d0,c,n+1,src1,n+1,0.d0,csrc1,n+1) +!--------------------------------------------------------------------- +DO k = 0,n + slc1sum(k) = 0.0D0 + DO j = 0,n + slc1sum(k) = slc1sum(k) + slc1(j,k) + END DO +END DO +RETURN +END SUBROUTINE + +subroutine getLambda(Ncheb,Lambda) +! set up the Lambda matrix which differentiates the coefficients of an +! Chebyshev expansion +implicit none +integer :: Ncheb +double precision :: Lambda(0:Ncheb,0:Ncheb) +!local +integer icheb,icheb2 +do icheb2=1,Ncheb,2 + Lambda(0,icheb2)=icheb2 +end do +do icheb=1,Ncheb + do icheb2=icheb+1,Ncheb,2 + Lambda(icheb,icheb2)=icheb2*2 + end do +end do +end subroutine - moment_x=moment(1) - moment_y=moment(2) - moment_z=moment(3) - - totmoment=SQRT(moment(1)**2+moment(2)**2+moment(3)**2) - totxymoment=SQRT(moment(1)**2+moment(2)**2) - - IF (ABS(totxymoment) > 1D-05) THEN - IF (ABS(moment(3)) < 1D-05) THEN - thetanew=pi/2D0 - ELSE - thetanew=ACOS(moment(3)/totmoment) - END IF - IF (totxymoment < 1D-05) THEN - phinew=0D0 - ELSE - phinew=DATAN2(moment(2),moment(1)) - END IF - END IF - ! UPDATE ANGLES -! phi = phinew -! theta = thetanew +subroutine getCinvmatrix(Ncheb,Cinvmatrix) +! calculates the C**-1 matrix according to: +! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) +implicit none +integer, intent(in) :: ncheb +double precision, intent(out) :: Cinvmatrix(0:Ncheb,0:Ncheb) +!local +double precision :: pi +integer :: icheb1,icheb2 +double precision :: fac - ! THETANEW=ACOS(MOMENT(3)/TOTMOMENT) -! PHINEW=DATAN2(MOMENT(2),MOMENT(1)) -! WRITE(6,*) 'moment',moment(1),moment(2),moment(3) -! WRITE(6,*) 'total moment',TOTMOMENT,TOTXYMOMENT -! WRITE(6,*) 'angles', thetanew,phinew -! WRITE(11,*) thetanew,phinew -! WRITE(12,*) thetanew,phinew +pi=4d0*datan(1d0) +fac=1.0D0/(Ncheb+1) +do icheb1=0,ncheb + do icheb2=0,ncheb + Cinvmatrix(icheb1,icheb2)=fac*dcos(icheb1*pi*((Ncheb-icheb2)+0.5D0)/(Ncheb+1)) + end do + fac=2.0D0/(Ncheb+1) +end do -! Use old angles for rotation -!if (angle_fixed == 1) then -! thetanew = theta -! phinew = phi -!endif +end subroutine getCinvmatrix - CALL rotatevector(rho2nsnew,rho2ns,irws,lmpotd,thetanew,phinew, & - theta,phi,irmd) - CALL rotatevector(r2nefnew,r2nef,irws,lmpotd,thetanew,phinew, & - theta,phi,irmd) +subroutine getCmatrix(Ncheb,Cmatrix) +! calculates the C matrix according to: +! Gonzalez et al, Journal of Computational Physics 134, 134-149 (1997) +implicit none +integer, intent(in) :: ncheb +double precision, intent(out) :: Cmatrix(0:Ncheb,0:Ncheb) +double precision :: pi +!local +integer :: icheb1,icheb2 -else ! angle fixed +pi=4d0*datan(1d0) +do icheb1=0,ncheb + do icheb2=0,ncheb + ! maybe incorrect + Cmatrix(icheb2,icheb1)=dcos(icheb1*pi*((Ncheb-icheb2)+0.5D0)/(Ncheb+1)) + end do +end do +end subroutine getCmatrix - rho2ns_temp(1,1)=rho2int(1) - rho2ns_temp(2,2)=rho2int(2) - rho2ns_temp(1,2)=rho2int(3) - rho2ns_temp(2,1)=rho2int(4) - - CALL rotatematrix(rho2ns_temp,theta,phi,1,0) - - rho2int(1)=rho2ns_temp(1,1) - rho2int(2)=rho2ns_temp(2,2) - rho2int(3)=rho2ns_temp(1,2) - rho2int(4)=rho2ns_temp(2,1) - moment(1)=DIMAG(rho2int(3)+rho2int(4)) - moment(2)=-REAL(rho2int(3)-rho2int(4)) - moment(3)=DIMAG(-rho2int(1)+rho2int(2)) - moment_x=moment(1) - moment_y=moment(2) - moment_z=moment(3) - - rho2ns(:,:,:)=DIMAG(rho2nsnew(:,:,:)) - r2nef(:,:,:)=DIMAG(r2nefnew(:,:,:)) -endif +subroutine create_Umatrix(theta,phi,lmmax,Umat,Udeggamat) +implicit none +!*********************************************************************** +! create the rotation matrix: +! | cos(theta/2) exp(-i/2 phi) -sin(theta/2) exp(-i/2 phi) | +! U= | | +! | sin(theta/2) exp( i/2 phi) cos(theta/2) exp( i/2 phi) | +! +! Udegga = transpose(complex conjug ( U ) ) +!***********************************************************************double +!precision :: phi +!interface +double precision,intent(in) :: phi +double precision,intent(in) :: theta +integer,intent(in) :: lmmax +double complex,intent(out) :: Umat(2*lmmax,2*lmmax) +double complex,intent(out) :: Udeggamat(2*lmmax,2*lmmax) +!local +double complex :: Umat11,Umat12,Umat21,Umat22 +double complex :: Udeggamat11,Udeggamat12,Udeggamat21,Udeggamat22 +integer :: ival +double complex,parameter :: ci=(0.0D0,1.0D0) +character*25 :: spinmode -idim = irmd*lmpotd -CALL dscal(idim,2.d0,rho2ns(1,1,1),1) -CALL daxpy(idim,-0.5D0,rho2ns(1,1,1),1,rho2ns(1,1,2),1) -CALL daxpy(idim,1.0D0,rho2ns(1,1,2),1,rho2ns(1,1,1),1) +spinmode='kkr' +if (spinmode=='regular') then + Umat11 = cos(theta/2.0D0)*exp(-ci/2.0D0*phi) + Umat12 = -sin(theta/2.0D0)*exp(-ci/2.0D0*phi) + Umat21 = sin(theta/2.0D0)*exp( ci/2.0D0*phi) + Umat22 = cos(theta/2.0D0)*exp( ci/2.0D0*phi) +else if (spinmode=='kkr') then + Umat11 = cos(theta/2.0D0)*exp( ci/2.0D0*phi) + Umat12 = sin(theta/2.0D0)*exp( ci/2.0D0*phi) + Umat21 = -sin(theta/2.0D0)*exp(-ci/2.0D0*phi) + Umat22 = cos(theta/2.0D0)*exp(-ci/2.0D0*phi) +else + stop '[create_Umatrix] mode not known' +end if -! --> do the same at the Fermi energy +Umat=(0.0D0,0.0D0) +do ival=1,lmmax + Umat( ival, ival) = Umat11 + Umat( ival,lmmax+ival) = Umat12 + Umat(lmmax+ival,ival) = Umat21 + Umat(lmmax+ival,lmmax+ival) = Umat22 +end do -CALL dscal(idim,2.d0,r2nef(1,1,1),1) -CALL daxpy(idim,-0.5D0,r2nef(1,1,1),1,r2nef(1,1,2),1) -CALL daxpy(idim,1.0D0,r2nef(1,1,2),1,r2nef(1,1,1),1) +if (spinmode=='regular') then +Udeggamat11 = cos(theta/2.0D0)*exp( ci/2.0D0*phi) +Udeggamat12 = sin(theta/2.0D0)*exp(-ci/2.0D0*phi) +Udeggamat21 = -sin(theta/2.0D0)*exp( ci/2.0D0*phi) +Udeggamat22 = cos(theta/2.0D0)*exp(-ci/2.0D0*phi) +else if (spinmode=='kkr') then +Udeggamat11 = cos(theta/2.0D0)*exp(-ci/2.0D0*phi) +Udeggamat12 = -sin(theta/2.0D0)*exp( ci/2.0D0*phi) +Udeggamat21 = sin(theta/2.0D0)*exp(-ci/2.0D0*phi) +Udeggamat22 = cos(theta/2.0D0)*exp( ci/2.0D0*phi) +else + stop '[create_Umatrix] mode not known' +end if -DO lm1=0,lmaxd1 - DO ie=1,iemxd - DO jspin=1,nspin - den_out(lm1,ie,jspin) = den(lm1,ie,jspin,1) - END DO - END DO -END DO -! UPDATE ANGLES -if (angle_fixed == 0) then -phi = phinew -theta = thetanew -endif -deallocate(vins) -deallocate(vnspll0) -deallocate(vnspll1) -deallocate(vnspll) -deallocate(hlk) -deallocate(jlk) -deallocate(hlk2) -deallocate(jlk2) -deallocate(tmatsph) -deallocate(rll) -deallocate(rllleft) -deallocate(sllleft) -deallocate(cden) -deallocate(cdenlm) -deallocate(cdenns) -deallocate(rho2nsc,rho2nsc_loop) -deallocate(rho2nsnew) -deallocate(r2nefc,r2nefc_loop) -deallocate(r2nefnew) -deallocate(r2orbc) -deallocate(cdentemp) -deallocate(gflle_part) -deallocate(gflle) -deallocate(den,denlm) -END SUBROUTINE rhovalnew +Udeggamat=(0.0D0,0.0D0) +do ival=1,lmmax + Udeggamat( ival, ival) = Udeggamat11 + Udeggamat( ival,lmmax+ival) = Udeggamat12 + Udeggamat(lmmax+ival,ival) = Udeggamat21 + Udeggamat(lmmax+ival,lmmax+ival) = Udeggamat22 +end do -SUBROUTINE rhooutnew(nsra,lmmaxd,lmmaxso,lmax,gmatll,ek, & - df,cleb,icleb,iend, & - irmdnew,thetasnew,ifunm,imt1, & - lmsp,rll,rllleft,sllleft, & - cden,cdenlm,cdenns,rho2nsc,corbital, & - lmaxd) - -! Code converted using TO_F90 by Alan Miller -! Date: 2016-04-21 Time: 16:24:21 +end subroutine create_Umatrix + +SUBROUTINE spin_orbit_one_l(lmax,l_s) IMPLICIT NONE -INTEGER, INTENT(IN) :: nsra -INTEGER, INTENT(IN) :: lmmaxd -INTEGER, INTENT(IN) :: lmmaxso -INTEGER, INTENT(IN) :: lmax -DOUBLE COMPLEX, INTENT(IN) :: gmatll(:,:) -DOUBLE COMPLEX, INTENT(IN) :: ek -!INTEGER, INTENT(IN) :: lmpotd -DOUBLE COMPLEX, INTENT(IN) :: df -!INTEGER, INTENT(IN) :: npan_tot -!INTEGER, INTENT(IN) :: ncheb -DOUBLE PRECISION, INTENT(IN) :: cleb(:) -INTEGER, INTENT(IN) :: icleb(:,:) -INTEGER, INTENT(IN) :: iend -INTEGER, INTENT(IN) :: irmdnew -!INTEGER, INTENT(IN) :: nrmaxd -DOUBLE PRECISION, INTENT(IN) :: thetasnew(:,:) -INTEGER, INTENT(IN) :: ifunm(:) -!DOUBLE PRECISION, INTENT(IN) :: rnew(:) -INTEGER, INTENT(IN) :: imt1 -INTEGER, INTENT(IN) :: lmsp(:) -DOUBLE COMPLEX, INTENT(IN) :: rll(:,:,:) -!DOUBLE COMPLEX, INTENT(IN) :: sll(:,:,:) -DOUBLE COMPLEX, INTENT(IN) :: rllleft(:,:,:) -DOUBLE COMPLEX, INTENT(IN) :: sllleft(:,:,:) -DOUBLE COMPLEX, INTENT(OUT) :: cden(:,0:,:) -DOUBLE COMPLEX, INTENT(OUT) :: cdenlm(:,:,:) -DOUBLE COMPLEX, INTENT(OUT) :: cdenns(:,:) -DOUBLE COMPLEX, INTENT(OUT) :: rho2nsc(:,:,:) -INTEGER, INTENT(IN) :: corbital -!DOUBLE COMPLEX, INTENT(OUT) :: gflle_part(:,:) -!DOUBLE PRECISION, INTENT(IN) :: rpan_intervall(:) -!INTEGER, INTENT(IN) :: ipan_intervall(:) -INTEGER, INTENT(IN) :: lmaxd ! new parameter +INTEGER, INTENT(IN) :: lmax +DOUBLE COMPLEX, INTENT(OUT) :: l_s((2*lmax+1)*2,(2*lmax+1)*2) +! ************************************************************************ +! in this subroutine the matrix L*S is calculated for the basis of +! real spherical harmonics -!INCLUDE 'inc.p' +! schematically it has the form +! ( -L_z L_+ ) +! ( L_- L_z ) -DOUBLE COMPLEX, PARAMETER :: czero=(0D0,0D0) -DOUBLE COMPLEX, PARAMETER :: cone=(1D0,0D0) -DOUBLE COMPLEX cltdf -INTEGER :: ir,jspin,lm1,lm2,lm3,m1,l1,j,ifun -DOUBLE PRECISION :: c0ll -DOUBLE COMPLEX, allocatable :: wr(:,:,:),qnsi(:,:),pnsi(:,:), & - cwr(:) ! lmlm-dos -INTEGER :: lmshift1(4),lmshift2(4) -DOUBLE COMPLEX, allocatable :: loperator(:,:,:) -LOGICAL :: test,opt -EXTERNAL test,opt -allocate(wr(lmmaxso,lmmaxso,irmdnew)) -allocate(cwr(irmdnew)) -allocate(qnsi(lmmaxso,lmmaxso)) -allocate(pnsi(lmmaxso,lmmaxso)) -allocate(loperator(lmmaxso,lmmaxso,3)) +! local variables +INTEGER :: i1,i2,i1l +DOUBLE COMPLEX :: icompl +DOUBLE COMPLEX,allocatable :: l_min(:,:) +DOUBLE COMPLEX,allocatable :: l_up(:,:) +DOUBLE PRECISION :: lfac -wr=czero -cwr=czero -qnsi=czero -pnsi=czero -! set LMSHIFT value which is need to construct CDEN -lmshift1(1)=0 -lmshift1(2)=lmmaxd -lmshift1(3)=0 -lmshift1(4)=lmmaxd -lmshift2(1)=0 -lmshift2(2)=lmmaxd -lmshift2(3)=lmmaxd -lmshift2(4)=0 -! for orbital moment -IF (corbital /= 0) THEN - CALL calc_orbitalmoment(lmaxd,lmmaxso,loperator) -END IF -c0ll=1D0/SQRT(16D0*ATAN(1D0)) -cden=czero -cdenlm=czero +icompl=(0D0,1D0) -DO ir = 1,irmdnew - - DO lm1 = 1,lmmaxso - DO lm2 = 1,lmmaxso - qnsi(lm1,lm2)=sllleft(lm1,lm2,ir) -! PNSI(LM1,LM2)=RLL(LM1,LM2,IR) - pnsi(lm1,lm2)=rllleft(lm1,lm2,ir) - END DO + +allocate(l_min(-lmax:lmax,-lmax:lmax)) +allocate(l_up(-lmax:lmax,-lmax:lmax)) + +! initialize the matrix + +DO i1=1,(2*lmax+1)*2 + DO i2=1,(2*lmax+1)*2 + l_s(i2,i1)=0D0 END DO -! CALL ZGEMM('N','N',LMMAXSO,LMMAXSO,LMMAXSO,CONE,PNSI, -! + LMMAXSO,GMATLL,LMMAXSO,EK,QNSI,LMMAXSO) - CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,cone,pnsi, & - lmmaxso,gmatll,lmmaxso,ek,qnsi,lmmaxso) - DO lm1 = 1,lmmaxso - DO lm2 = 1,lmmaxso - pnsi(lm1,lm2)=rll(lm1,lm2,ir) - END DO +END DO + +DO i1=-lmax,lmax + DO i2=-lmax,lmax + l_min(i2,i1)=0D0 + l_up(i2,i1)=0D0 END DO - CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,cone,pnsi, & - lmmaxso,qnsi,lmmaxso,czero,wr(1,1,ir),lmmaxso) +END DO + +! fill the second and the forth quadrant with L_z +! (-L_z,respectively) + + +DO i1=1,2*lmax+1 + i1l=i1-lmax-1 ! the value of m (varies from -l to +l) + i2=2*lmax+1-(i1-1) - IF (nsra == 2) THEN - DO lm1 = 1,lmmaxso - DO lm2 = 1,lmmaxso -! QNSI(LM1,LM2)=SLLLEFT(LM1+LMMAXSO,LM2,IR) - qnsi(lm1,lm2)=-sllleft(lm1+lmmaxso,lm2,ir) -! PNSI(LM1,LM2)=RLLLEFT(LM1+LMMAXSO,LM2,IR) - pnsi(lm1,lm2)=-rllleft(lm1+lmmaxso,lm2,ir) - END DO - END DO -! CALL ZGEMM('N','N',LMMAXSO,LMMAXSO,LMMAXSO,CONE,PNSI, -! + LMMAXSO,GMATLL,LMMAXSO,EK,QNSI,LMMAXSO) - CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,cone,pnsi, & - lmmaxso,gmatll,lmmaxso,ek,qnsi,lmmaxso) - DO lm1 = 1,lmmaxso - DO lm2 = 1,lmmaxso - pnsi(lm1,lm2)=rll(lm1+lmmaxso,lm2,ir) - END DO - END DO - CALL zgemm('N','T',lmmaxso,lmmaxso,lmmaxso,cone,pnsi, & - lmmaxso,qnsi,lmmaxso,cone,wr(1,1,ir),lmmaxso) - END IF +! L_S(i2,i1)=icompl*i1l + l_s(i2,i1)=-icompl*i1l -! for orbital moment - IF (corbital /= 0) THEN - CALL zgemm('N','N',lmmaxso,lmmaxso,lmmaxso,cone, & - loperator(1,1,corbital),lmmaxso,wr(1,1,ir), lmmaxso,czero,pnsi,lmmaxso) - DO lm1=1,lmmaxso - DO lm2=1,lmmaxso - wr(lm1,lm2,ir)=pnsi(lm1,lm2) - END DO - END DO - END IF +END DO + +DO i1=2*lmax+2,(2*lmax+1)*2 + i1l=i1-lmax-1-(2*lmax+1) ! the value of m (varies from -l to +l) + i2=(2*lmax+1)*2-(i1-(2*lmax+2)) - DO jspin = 1,4 - DO lm1 = 1,lmmaxd - DO lm2 = 1,lm1-1 - wr(lm1+lmshift1(jspin),lm2+lmshift2(jspin),ir)= & - wr(lm1+lmshift1(jspin),lm2+lmshift2(jspin),ir)+ & - wr(lm2+lmshift1(jspin),lm1+lmshift2(jspin),ir) - END DO - END DO - END DO ! JSPIN +! L_S(i2,i1)=-icompl*i1l + l_s(i2,i1)=icompl*i1l -END DO !IR +END DO + +! implement now L_- in the third quadrant +IF (lmax>0) THEN + + lfac=SQRT(lmax*(lmax+1D0))/SQRT(2D0) + l_min(0,-1)=-icompl*lfac +! l_min(0,-1)=icompl*lfac + l_min(0,1)=lfac + l_min(-1,0)=icompl*lfac + l_min(1,0)=-lfac + + IF (lmax > 1) THEN + + DO i1=2,lmax + + lfac=0.5D0*SQRT(lmax*(lmax+1D0)-i1*(i1-1D0)) + l_min(-i1,-i1+1)=-lfac + l_min(-i1,i1-1)=icompl*lfac + l_min(i1,-i1+1)=-icompl*lfac + l_min(i1,i1-1)=-lfac + + lfac=0.5D0*SQRT(lmax*(lmax+1D0)-(i1-1)*(i1)) + l_min(-i1+1,-i1)=lfac + l_min(-i1+1,i1)=icompl*lfac + l_min(i1-1,-i1)=-icompl*lfac + l_min(i1-1,i1)=lfac + + END DO + + END IF +END IF -!IF (opt('lmlm-dos')) THEN ! lmlm-dos -! Integrate only up to muffin-tin radius. ! lmlm-dos -! gflle_part = czero ! lmlm-dos -! DO lm2 = 1,lmmaxso ! lmlm-dos -! DO lm1 = 1,lmmaxso ! lmlm-dos -! For integration up to MT radius do this: ! lmlm-dos -! CWR(1:IMT1) = WR(LM1,LM2,1:IMT1) ! lmlm-dos -! CWR(IMT1+1:IRMDNEW) = CZERO ! lmlm-dos -! CALL INTCHEB_CELL(CWR,GFLLE_PART(LM1,LM2),RPAN_INTERVALL, ! lmlm-dos -! + IPAN_INTERVALL,NPAN_TOT,NCHEB,IRMDNEW) ! lmlm-dos -! For full cell integration replace loop content with this: ! lmlm-dos -! cwr(1:irmdnew) = wr(lm1,lm2,1:irmdnew) ! lmlm-dos -! DO ir=imt1+1,irmdnew ! lmlm-dos -! cwr(ir) = cwr(ir)*thetasnew(ir,1)*c0ll ! lmlm-dos -! END DO ! lmlm-dos -! CALL intcheb_cell(cwr,gflle_part(lm1,lm2),rpan_intervall, & ! lmlm-dos & -! ipan_intervall,npan_tot,ncheb,irmdnew) ! lmlm-dos -! END DO ! lmlm-dos -! END DO ! lmlm-dos -!END IF ! OPT('lmlm-dos') - - -! DO IR = 1,IRMDNEW -! DO JSPIN = 1,4 -! DO LM1 = 1,LMMAXD -! DO LM2 = 1,LM1-1 -! WR(LM1+LMSHIFT1(JSPIN),LM2+LMSHIFT2(JSPIN),IR)= -! + WR(LM1+LMSHIFT1(JSPIN),LM2+LMSHIFT2(JSPIN),IR)+ -! + WR(LM2+LMSHIFT1(JSPIN),LM1+LMSHIFT2(JSPIN),IR) -! ENDDO -! ENDDO -! ENDDO ! JSPIN -! ENDDO !IR +DO i1=-lmax,lmax + DO i2=-lmax,lmax + l_s(i2+3*lmax+2,i1+lmax+1)=l_min(i1,i2) + END DO +END DO -! first calculate the spherical symmetric contribution +! implement now L_+ in the quadrant -DO l1 = 0,lmax +IF (lmax>0) THEN - DO m1 = -l1,l1 - lm1 = l1*(l1+1)+m1+1 - DO ir = 1,irmdnew - DO jspin=1,4 - cden(ir,l1,jspin) = cden(ir,l1,jspin)+ & - wr(lm1+lmshift1(jspin),lm1+lmshift2(jspin),ir) - cdenlm(ir,lm1,jspin) = wr(lm1+lmshift1(jspin),lm1+lmshift2(jspin),ir) - END DO ! JPSIN - END DO ! IR - END DO ! M1 + lfac=SQRT(lmax*(lmax+1D0))/SQRT(2D0) + l_up(0,-1)=-icompl*lfac + l_up(0,1)=-lfac + l_up(-1,0)=icompl*lfac + l_up(1,0)=lfac - DO jspin = 1,4 - DO ir = 1,irmdnew - rho2nsc(ir,1,jspin) = rho2nsc(ir,1,jspin)+ c0ll*(cden(ir,l1,jspin)*df) - END DO ! IR + IF (lmax > 1) THEN - DO ir=imt1+1,irmdnew - cden(ir,l1,jspin) = cden(ir,l1,jspin)*thetasnew(ir,1)*c0ll + DO i1=2,lmax - DO m1 = -l1,l1 - lm1 = l1*(l1+1)+m1+1 - cdenlm(ir,lm1,jspin) = cdenlm(ir,lm1,jspin) *thetasnew(ir,1)*c0ll - END DO ! M1 - END DO ! IR + lfac=0.5D0*SQRT(lmax*(lmax+1D0)-i1*(i1-1D0)) + l_up(-i1,-i1+1)=lfac + l_up(-i1,i1-1)=icompl*lfac + l_up(i1,-i1+1)=-icompl*lfac + l_up(i1,i1-1)=lfac + + lfac=0.5D0*SQRT(lmax*(lmax+1D0)-(i1-1)*(i1)) + l_up(-i1+1,-i1)=-lfac + l_up(-i1+1,i1)=icompl*lfac + l_up(i1-1,-i1)=-icompl*lfac + l_up(i1-1,i1)=-lfac + + END DO - END DO ! JSPIN - -END DO ! L1 + END IF +END IF -cdenns=czero -DO j = 1,iend - lm1 = icleb(j,1) - lm2 = icleb(j,2) - lm3 = icleb(j,3) - cltdf = df*cleb(j) - - DO jspin = 1,4 - DO ir = 1,irmdnew - rho2nsc(ir,lm3,jspin) = rho2nsc(ir,lm3,jspin) + & - (cltdf*wr(lm1+lmshift1(jspin),lm2+lmshift2(jspin),ir)) - END DO - - IF (lmsp(lm3) > 0) THEN - ifun = ifunm(lm3) - DO ir=imt1+1,irmdnew - cdenns(ir,jspin) = cdenns(ir,jspin)+ & - cleb(j)*wr(lm1+lmshift1(jspin),lm2+lmshift2(jspin),ir)* & - thetasnew(ir,ifun) - END DO - END IF - END DO ! JSPIN -END DO ! J +DO i1=-lmax,lmax + DO i2=-lmax,lmax + l_s(i2+lmax+1,i1+3*lmax+2)=l_up(i1,i2) + END DO +END DO -deallocate(wr) -deallocate(cwr) -deallocate(qnsi) -deallocate(pnsi) -END SUBROUTINE rhooutnew + +deallocate(l_min) +deallocate(l_up) + + +END SUBROUTINE spin_orbit_one_l subroutine intcheb_cell(cden,den,rpan_intervall,ipan_intervall, & @@ -6177,7 +5133,6 @@ do ir=1,nrmesh end do end subroutine getCCmatrix - subroutine create_Wmatrix(theta,phi,theta_old,phi_old,lmmax,Wmat1,Wmat2) implicit none !*********************************************************************** diff --git a/source/KKRnano/source/PotentialConverter_mod.F90 b/source/KKRnano/source/PotentialConverter_mod.F90 index 546a3ca068fc4f5f32e299bd7878691955e5f848..9fbdf63290127f2c04738060c971f10d8a731bac 100644 --- a/source/KKRnano/source/PotentialConverter_mod.F90 +++ b/source/KKRnano/source/PotentialConverter_mod.F90 @@ -1,8 +1,3 @@ -!-------------------------------------------------------------------------------- -! Copyright (c) 2018 Forschungszentrum Juelich GmbH, Juelich, Germany -! This file is part of KKRnano and available as free software under the conditions -! of the MIT license as expressed in the LICENSE file in more detail. -!-------------------------------------------------------------------------------- module PotentialConverter_mod !------------------------------------------------------------------------------- !> Summary: Converts unformatted potential file to the KKRhost formatted potential file format @@ -52,10 +47,10 @@ module PotentialConverter_mod call associateBasisAtomMesh(atomdata, mesh) ! show data on stdout - call represent(mesh, str) - write(*, '(A)') str - call represent(atomdata%potential, str) - write(*, '(A)') str +! call represent(mesh, str) +! write(*, '(A)') str +! call represent(atomdata%potential, str) +! write(*, '(A)') str call writeFormattedPotential(Efermi, ALAT, VBC, KXC, atomdata) @@ -190,7 +185,7 @@ module PotentialConverter_mod double precision :: rv, sm integer :: ic, ir, irmin, is, lm, lmnr, lmpot, nr - integer, parameter :: isave = 1, inew = 1 + integer, parameter :: isave = 1, inew = 2 double precision, parameter :: qbound = 1.d-10 character(len=24), parameter :: txc(0:3) = [' Morruzi,Janak,Williams', ' von Barth,Hedin ', ' Vosko,Wilk,Nusair ', ' GGA PW91 '] character(len=*), parameter :: F9000 = "(7a4,6x,' exc:',a24,3x,a10)", & @@ -236,7 +231,8 @@ module PotentialConverter_mod enddo ! lm !---> write a one to mark the end - if (lmnr < lmpot) write(ifile, fmt=F9060) isave +! if (lmnr < lmpot) write(ifile, fmt=F9060) isave + write(ifile, fmt=F9060) isave endif enddo ! is diff --git a/source/KKRnano/source/ProcessKKRresults_mod.F90 b/source/KKRnano/source/ProcessKKRresults_mod.F90 index 35814f530ed649520e0fa64ccbf9d9576e57909d..43a67fb690211632335f40a3b1cc87a04e3b94c7 100644 --- a/source/KKRnano/source/ProcessKKRresults_mod.F90 +++ b/source/KKRnano/source/ProcessKKRresults_mod.F90 @@ -451,6 +451,7 @@ module ProcessKKRresults_mod double precision :: chrgNt_local double precision :: new_fermi double precision :: CHRGSEMICORE !< total semicore charge over all atoms + double precision :: fsemicore_in integer :: ila, r1fu integer :: num_local_atoms @@ -659,7 +660,12 @@ module ProcessKKRresults_mod ! --> Sum up semicore charges from different MPI ranks call sumChargeSemi_com(CHRGSEMICORE, mp%mySEComm) ! --> Recalculate the semicore contour factor FSEMICORE - if (mp%isMasterRank) call calcFactorSemi(CHRGSEMICORE, emesh%FSEMICORE, params%fsemicore) + if(iter==1) then + fsemicore_in = params%fsemicore + else + fsemicore_in = emesh%FSEMICORE + endif + if (mp%isMasterRank) call calcFactorSemi(CHRGSEMICORE, emesh%FSEMICORE, fsemicore_in) endif emesh%E2 = new_fermi ! Assumes that for every atom the same Fermi correction @@ -1532,6 +1538,9 @@ module ProcessKKRresults_mod double precision moment_x !NOCO double precision moment_y !NOCO double precision moment_z !NOCO + double precision sum_moment_x !NOCO + double precision sum_moment_y !NOCO + double precision sum_moment_z !NOCO double precision max_delta_theta !NOCO double precision max_delta_phi !NOCO double precision max_delta_angle !NOCO @@ -1572,6 +1581,9 @@ module ProcessKKRresults_mod if (korbit == 1) open(14,file='nonco_moment_out.txt',form='formatted') ! NOCO ! moments output + sum_moment_x = 0.0d0 + sum_moment_y = 0.0d0 + sum_moment_z = 0.0d0 do i1 = 1, natoms if (npol == 0) then read(71, rec=i1) qc,catom,charge,ecore,muorb,phi_noco,theta_noco,phi_noco_old,theta_noco_old,angle_fixed, & @@ -1613,8 +1625,14 @@ module ProcessKKRresults_mod theta_noco/(2.0D0*PI)*360.0D0, & phi_noco/(2.0D0*PI)*360.0D0, & angle_fixed + sum_moment_x = sum_moment_x + moment_x + sum_moment_y = sum_moment_y + moment_y + sum_moment_z = sum_moment_z + moment_z endif enddo ! i1 + if (korbit == 1) then ! NOCO + write(14,"(3f12.5)") sum_moment_x, sum_moment_y, sum_moment_z + endif if (korbit == 1) close(13) if (korbit == 1) close(14) diff --git a/source/KKRnano/source/RefCluster_mod.F90 b/source/KKRnano/source/RefCluster_mod.F90 index 1199b1157178340a69a0f03d38649215881e3e1f..67ee595f19f29a4d68875eff9d487d71be18be5d 100644 --- a/source/KKRnano/source/RefCluster_mod.F90 +++ b/source/KKRnano/source/RefCluster_mod.F90 @@ -166,7 +166,7 @@ module RefCluster_mod #ifdef DEBUG write(*,'(a,2(i0,a),9999(" ",i0))') 'for atom #',source_atom_index,' indn0(1:',self%numn0,') =',self%indn0(:) - write(*,'(a,3F16.12)') 'rcls(:,1) = ',rcls(1:3,1) + write(*,'(a,3F16.12)') 'rcls(:,1) = ',self%rcls(1:3,1) #endif ! todo: display some statistics #ifdef DEBUG diff --git a/source/KKRnano/source/ScatteringCalculation_mod.F90 b/source/KKRnano/source/ScatteringCalculation_mod.F90 index f19794634aa9ae2c7c1e2e70c08b081ed7616744..dbdf267b417f46754e0566a4f24f91ef44ae6375 100644 --- a/source/KKRnano/source/ScatteringCalculation_mod.F90 +++ b/source/KKRnano/source/ScatteringCalculation_mod.F90 @@ -107,7 +107,7 @@ implicit none integer :: omp_threads !DEBUGGING logical :: xccpl double precision :: rMTref - double precision, allocatable :: rMTs(:) + double precision, allocatable :: rMTs(:,:), rMTrefs(:,:) double complex, allocatable :: tmatLL(:,:,:,:) !< all t-matrices inside the truncation zone double complex, allocatable :: GmatN_buffer(:,:,:) !< GmatN for all local atoms @@ -187,9 +187,12 @@ implicit none enddo endif !--------------------------------------------------------- - allocate(rMTs(calc%trunc_zone%naez_trc)) - call distribute(calc%xTable, 1, calc%atomdata_a(:)%rMTref, rMTs) ! communicate the Muffin-Tin radii within the truncation zone - + allocate(rMTs(1,calc%trunc_zone%naez_trc), rMTrefs(1,num_local_atoms)) + rMTrefs(1,:) = calc%atomdata_a(:)%rMTref + ! communicate the Muffin-Tin radii within the truncation zone + call distribute(calc%xTable, 1, rMTrefs, rMTs) + deallocate(rMTrefs, stat=ist) ! ignore status + ! IE ==================================================================== ! BEGIN do loop over energies (EMPID-parallel) ! IE ==================================================================== @@ -212,7 +215,7 @@ implicit none do iacls = 1, calc%ref_cluster_a(ila)%nacls ! this calls tref several times with the same parameters if the local atoms are close to each other ! rMTref = kkr(ila)%rMTref(iacls) ! possible if it has been communicated earlier - rMTref = rMTs(calc%trunc_zone%trunc_atom_idx(calc%ref_cluster_a(ila)%atom(iacls))) + rMTref = rMTs(1,calc%trunc_zone%trunc_atom_idx(calc%ref_cluster_a(ila)%atom(iacls))) call tref(emesh%EZ(IE), params%vref, dims%lmaxd, rMTref, & kkr(ila)%Tref_ell(:,iacls), kkr(ila)%dTref_ell(:,iacls), derive=(dims%Lly > 0)) !if (dims%korbit == 1) then ! NOCO @@ -267,7 +270,7 @@ implicit none noco%theta_noco(i1),noco%phi_noco(i1),1, & !ipot=1 because potential has only one or two entries (spin polarized case) !dims%lly, & atomdata%potential%lmpot,atomdata%chebmesh_ptr%irmd_new, & - kkr(ila)%TmatN(:,:,ispin),params%soc) + kkr(ila)%TmatN(:,:,ispin),params%soc,params%enable_quad_prec) call rotatematrix(kkr(ila)%TmatN(:,:,ispin),noco%theta_noco(i1),noco%phi_noco(i1),lmmaxd,0) else @@ -537,7 +540,7 @@ implicit none enddo ! iorbit allocate(uTu_sum(lmmaxd_noco,lmmaxd_noco), uT(lmmaxd_noco,lmmaxd_noco)) - ! No symmtetrization is performed in case of a NOCO calculation + ! No symmetrization is performed in case of a NOCO calculation if (korbit == 0) then ! NOCO !------------------------------------------------- SYMMETRISE TmatN uTu_sum(:,:) = TmatN(:,:) ! copy, since the 1st entry is the unity operation, start loop from 2 diff --git a/source/KKRnano/source/XC/vxcgga.f90 b/source/KKRnano/source/XC/vxcgga.f90 index 09f78ce9e77052a0bacc705e20976091de57a0c9..936d12d87ee6a002037ffaae095b6d4f3d33f499 100644 --- a/source/KKRnano/source/XC/vxcgga.f90 +++ b/source/KKRnano/source/XC/vxcgga.f90 @@ -42,7 +42,7 @@ subroutine vxcgga(exc,kte,lpot,nspin,rho2ns,v,r,drdi,a, & implicit none -double precision, intent(out) :: exc(0:(lpot+1)**2) +double precision, intent(out) :: exc(0:lpot) integer, intent(in) :: kte integer, intent(in) :: lpot integer, intent(in) :: nspin diff --git a/source/KKRnano/source/datastructures/ChebMeshData_mod.F90 b/source/KKRnano/source/datastructures/ChebMeshData_mod.F90 index 2ed1cdf358d670c2e6b4e0afbca158a84429ccd6..e16f623bba67909425f4aaab3c9bf947320d45b0 100644 --- a/source/KKRnano/source/datastructures/ChebMeshData_mod.F90 +++ b/source/KKRnano/source/datastructures/ChebMeshData_mod.F90 @@ -335,6 +335,7 @@ subroutine ConstructChebMesh(r_log,npan_log,npan_eq,ncheb, & !use read_formatted_shapefun_mod, only: shapefunfile use RadialMeshData_mod, only: RadialMeshData +double precision :: r_fac double precision, intent(in) :: r_log integer, intent(in) :: npan_log integer, intent(in) :: npan_eq @@ -350,7 +351,6 @@ double precision, intent(in) :: thetas(:,:) integer, intent(in) :: nfu type(RadialMeshData), intent(in) :: radial_mesh -double precision, parameter :: fac=2d0 integer :: ipotm,ir2,ip, & ishift,ilogpanshift,ilinpanshift,npan_logtemp,npan_inst,imin,imax,iminnew,imaxnew,lm1 double precision :: rmin,rmax,rval @@ -378,9 +378,9 @@ ipotm=0 if (ilinpanshift == 1) then stop 'non-spherical part of the potential needs to be inside the log panel' end if - + r_fac = (rmax/rmin)**(1.d0/npan_log) do ip=0,npan_log-ilogpanshift - rval=(fac**ip-1d0)/(fac**(npan_log-ilogpanshift)-1d0) + rval=(r_fac**ip-1d0)/(r_fac**(npan_log-ilogpanshift)-1d0) rpan_intervall(ip+ishift)= rmin+rval*(rmax-rmin) ipan_intervall(ip+ishift)= (ip+ishift)*(ncheb+1) if (ishift == 0.and. rpan_intervall(ip) > radial_mesh%r(radial_mesh%irmin)) then @@ -674,7 +674,7 @@ end if ! klo and khi now bracket the input value of x. h=xa(khi)-xa(klo) ! the xa's must be distinct. -if (h == 0.d0) pause 'bad xa input in splint' +if (h == 0.d0) STOP 'bad xa input in splint' !! used to be PAUSE ! cubic spline polynomial is now evaluated. a = (xa(khi)-x)/h b = (x-xa(klo))/h diff --git a/source/KKRnano/source/datastructures/InputParamsNew.txt b/source/KKRnano/source/datastructures/InputParamsNew.txt index a958fde0d48a0f422aa6d32ed56710abffce1a54..bf982f4d39c51feb3a6b81173ce087c2a76a0cc9 100644 --- a/source/KKRnano/source/datastructures/InputParamsNew.txt +++ b/source/KKRnano/source/datastructures/InputParamsNew.txt @@ -120,3 +120,5 @@ i npan_eq 30 i ncheb 10 ### [NOCO] size of logarithmic panel d r_log 0.1D0 +### parameter a for exponential radial mesh +d a_log 0.025D0 diff --git a/source/KKRnano/source/datastructures/InputParams_mod.F90 b/source/KKRnano/source/datastructures/InputParams_mod.F90 index cc2e06fb739ab698796544055bb9ca4fbd85e928..f6ada62cddc1fe9d30330ec53cf2ef793e8c0455 100644 --- a/source/KKRnano/source/datastructures/InputParams_mod.F90 +++ b/source/KKRnano/source/datastructures/InputParams_mod.F90 @@ -76,6 +76,8 @@ module InputParams_mod integer :: npan_eq integer :: ncheb double precision :: r_log + double precision :: a_log + logical :: enable_quad_prec endtype ! InputParams @@ -618,6 +620,24 @@ integer function getValues(filename, self) result(ierror) destroy_and_return endif + ierror = getValue(cr, "a_log", self%a_log , def=0.025D0) + if (ierror == use_default) then + write(*,*) "WARNING: Bad/no value given for a_log. Set a_log to 0.025D0" + ierror = 0 ! ok, no error + elseif (ierror /= 0) then + write(*,*) "Bad/no value given for a_log." + destroy_and_return + endif + + ierror = getValue(cr, "enable_quad_prec", self%enable_quad_prec , def=.false.) + if (ierror == use_default) then + write(*,*) "WARNING: Bad/no value given for enable_quad_prec. Set enable_quad_prec to .false." + ierror = 0 ! ok, no error + elseif (ierror /= 0) then + write(*,*) "Bad/no value given for enable_quad_prec." + destroy_and_return + endif + write(*,*) "Finished reading information from input.conf" destroy_and_return #undef destroy_and_return diff --git a/source/KKRnano/source/datastructures/RadialMeshData_mod.F90 b/source/KKRnano/source/datastructures/RadialMeshData_mod.F90 index a5084c0df4a380353fe83a41eb3883d2e91388da..355f6e5f4f18bddd6bdbe214fdd8e01c4553d239 100644 --- a/source/KKRnano/source/datastructures/RadialMeshData_mod.F90 +++ b/source/KKRnano/source/datastructures/RadialMeshData_mod.F90 @@ -160,17 +160,18 @@ module RadialMeshData_mod double precision, intent(in) :: radius_mt double precision, intent(in) :: a_log double precision, intent(in) :: b_log + double precision :: b_log_local !double precision, parameter :: A = 0.025d0 integer :: ii self%A = a_log - self%B = b_log - !self%B = radius_mt / (exp(a_log * (imt - 1)) - 1.d0) + b_log_local = radius_mt / (exp(a_log * (imt - 1)) - 1.d0) + self%B = b_log_local do ii = 1, imt - self%r(ii) = b_log * (exp(a_log * (ii - 1)) - 1.d0) - self%drdi(ii) = a_log * b_log * exp(a_log * (ii - 1)) + self%r(ii) = b_log_local * (exp(a_log * (ii - 1)) - 1.d0) + self%drdi(ii) = a_log * b_log_local * exp(a_log * (ii - 1)) enddo ! ii self%rmt = radius_MT diff --git a/source/KKRnano/source/madelung/MadelungCalculator_mod.F90 b/source/KKRnano/source/madelung/MadelungCalculator_mod.F90 index 7eeafff7e4410a7c73d0a01f88c6b23e3cbe17d2..da8839117391f246ce23c1195b0ea09d64268c98 100644 --- a/source/KKRnano/source/madelung/MadelungCalculator_mod.F90 +++ b/source/KKRnano/source/madelung/MadelungCalculator_mod.F90 @@ -886,7 +886,7 @@ module MadelungCalculator_mod det = determinant3x3_r(a) if(det == 0.) then #ifdef DEBUG - if(o>0) write(o,'(9A)') sym,' invert3x3: determinant = 0.' + write(*,'(9A)') ' invert3x3: determinant = 0.' #endif inverse = 0. return diff --git a/source/KKRnano/source/parallel/KKRnano_Comm_mod.F90 b/source/KKRnano/source/parallel/KKRnano_Comm_mod.F90 index fbe5f4e675d570674d16886078ed881aeee83aeb..76d54bfa3004c6e0b19bcd9a06489ef4740b1396 100644 --- a/source/KKRnano/source/parallel/KKRnano_Comm_mod.F90 +++ b/source/KKRnano/source/parallel/KKRnano_Comm_mod.F90 @@ -79,6 +79,7 @@ module KKRnano_Comm_mod !> Set the number of OpenMP threads to nthrds. subroutine setKKRnanoNumThreads(nthrds) integer, intent(in) :: nthrds +!$ external :: OMP_SET_NUM_THREADS if (nthrds > 0) then !$ call OMP_SET_NUM_THREADS(NTHRDS) endif ! nthrds > 0 diff --git a/source/KKRnano/source/parallel/comm_patterns_TYPE_mod.F95 b/source/KKRnano/source/parallel/comm_patterns_mod.F95 similarity index 96% rename from source/KKRnano/source/parallel/comm_patterns_TYPE_mod.F95 rename to source/KKRnano/source/parallel/comm_patterns_mod.F95 index 22580d664d4dfc7b19786a3a1c0538b0e0bc28d7..80d05c52216fc2a3d35304d515df4ce4ab383468 100644 --- a/source/KKRnano/source/parallel/comm_patterns_TYPE_mod.F95 +++ b/source/KKRnano/source/parallel/comm_patterns_mod.F95 @@ -19,9 +19,11 @@ !> Module that implements common communication patterns. !> Purpose: For use when collective communication is not possible !> Author: Elias Rabel, 2012 +!> Paul F Baumeister, 2019 ! -!> Change only comm_patterns_T Y P E_mod.F90, then run create_comm_patterns.sh -!> This creates the files for the different datatypes needed. +!> The file extension .F95 indicates that sed will be applied to this source file +!> to replace a missing template feature in Fortran. +!> Do not use more than one name with _TYPE per line! ! module comm_patterns_TYPE_mod implicit none diff --git a/source/KKRnano/source/parallel/create_comm_patterns.sh b/source/KKRnano/source/parallel/create_comm_patterns.sh deleted file mode 100755 index 0261e06a4a8293479a6b3a4dd9a19b2491a312d1..0000000000000000000000000000000000000000 --- a/source/KKRnano/source/parallel/create_comm_patterns.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -# Create files for different datatypes - -sed -e 's/_TYPE/Z/' comm_patterns_TYPE_mod.F95 > comm_patternsZ_mod.F90 -sed -e 's/_TYPE/D/' comm_patterns_TYPE_mod.F95 > comm_patternsD_mod.F90 -# sed -e 's/_TYPE/I/' comm_patterns_TYPE_mod.F95 > comm_patternsI_mod.F90 -sed -e 's/_TYPE/C/' comm_patterns_TYPE_mod.F95 > comm_patternsC_mod.F90 diff --git a/source/KKRnano/source/parallel/create_one_sided_comm.sh b/source/KKRnano/source/parallel/create_one_sided_comm.sh deleted file mode 100755 index 62b0a2901f446816ec13e906762e3b32384d8385..0000000000000000000000000000000000000000 --- a/source/KKRnano/source/parallel/create_one_sided_comm.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -# Create files for different datatypes - -sed -e 's/_TYPE/Z/' one_sided_comm_TYPE_mod.F95 > one_sided_commZ_mod.F90 -sed -e 's/_TYPE/D/' one_sided_comm_TYPE_mod.F95 > one_sided_commD_mod.F90 -# sed -e 's/_TYPE/I/' one_sided_comm_TYPE_mod.F95 > one_sided_commI_mod.F90 -# sed -e 's/_TYPE/C/' one_sided_comm_TYPE_mod.F95 > one_sided_commC_mod.F90 diff --git a/source/KKRnano/source/parallel/create_two_sided_comm.sh b/source/KKRnano/source/parallel/create_two_sided_comm.sh deleted file mode 100755 index af533337d60dfee5f9af49c724f6066d06a58063..0000000000000000000000000000000000000000 --- a/source/KKRnano/source/parallel/create_two_sided_comm.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -# Create files for different datatypes - -sed -e 's/_TYPE/Z/' two_sided_comm_TYPE_mod.F95 > two_sided_commZ_mod.F90 -sed -e 's/_TYPE/I/' two_sided_comm_TYPE_mod.F95 > two_sided_commI_mod.F90 -sed -e 's/_TYPE/D/' two_sided_comm_TYPE_mod.F95 > two_sided_commD_mod.F90 -# sed -e 's/_TYPE/C/' two_sided_comm_TYPE_mod.F95 > two_sided_commC_mod.F90 diff --git a/source/KKRnano/source/parallel/one_sided_comm_TYPE_mod.F95 b/source/KKRnano/source/parallel/one_sided_comm_mod.F95 similarity index 97% rename from source/KKRnano/source/parallel/one_sided_comm_TYPE_mod.F95 rename to source/KKRnano/source/parallel/one_sided_comm_mod.F95 index 2584d40e1fa0989134cdcbe822a0a93fad57274c..62b5dab3ac560a7692eddb47a4a402ca5a2ed98e 100644 --- a/source/KKRnano/source/parallel/one_sided_comm_TYPE_mod.F95 +++ b/source/KKRnano/source/parallel/one_sided_comm_mod.F95 @@ -36,6 +36,12 @@ !> !> \endverbatim +!> Note by Paul F Baumeister, 2019 +! +!> The file extension .F95 indicates that sed will be applied to this source file +!> to replace a missing template feature in Fortran. +!> Do not use more than one name with _TYPE per line! + #define COMMCHECK(X) if ( (X) /= 0 ) then; write(*,*) "Comm failure", X, __LINE__; STOP; endif #define CHECK(X) if ( .not. (X) ) then; write(*,*) "FAIL: ", __LINE__; STOP; endif @@ -209,7 +215,7 @@ endmodule ! one_sided_comm_TYPE_mod #ifdef TEST_ONE_SIDED_COMM__TYPE__ ! a test program - not compiled due to conditional compilation -program test +program test_one_sided_comm_TYPE use ChunkIndex_mod, only: getRankAndLocalIndex use one_sided_comm_TYPE_mod implicit none diff --git a/source/KKRnano/source/parallel/two_sided_comm_TYPE_mod.F95 b/source/KKRnano/source/parallel/two_sided_comm_mod.F95 similarity index 96% rename from source/KKRnano/source/parallel/two_sided_comm_TYPE_mod.F95 rename to source/KKRnano/source/parallel/two_sided_comm_mod.F95 index 548c2f32755cfc2095eaf5ab9bd58014bae66f09..2f57417df366a91b605c3e1abe8596ad301111e4 100644 --- a/source/KKRnano/source/parallel/two_sided_comm_TYPE_mod.F95 +++ b/source/KKRnano/source/parallel/two_sided_comm_mod.F95 @@ -36,6 +36,12 @@ !> !> \endverbatim +!> The file extension .F95 indicates that sed will be applied to this source file +!> to replace a missing template feature in Fortran. +!> Do not use more than one name with _TYPE per line! + +! #define DEBUG + #define NUMBERZ double complex #define NUMBERMPIZ MPI_DOUBLE_COMPLEX #define NUMBERC complex @@ -80,11 +86,12 @@ module two_sided_comm_TYPE_mod include 'mpif.h' ! only: MPI_STATUS_SIZE, MPI_INTEGER, MPI_REQUEST_NULL assert( self%comm /= 0 ) - + call MPI_Comm_rank(self%comm, myrank, ierr) allocate(sreq(self%send_n), sstats(MPI_STATUS_SIZE,self%send_n), & - rreq(self%recv_n), rstats(MPI_STATUS_SIZE,self%recv_n), stat=ist) ! ToDo: catch status + rreq(self%recv_n), rstats(MPI_STATUS_SIZE,self%recv_n), stat=ist) + if (ist /= 0) call MPI_Abort(self%comm, ist, ierr) sreq(:) = MPI_REQUEST_NULL rreq(:) = MPI_REQUEST_NULL @@ -99,19 +106,19 @@ module two_sided_comm_TYPE_mod do inz = self%send_start(ipair), self%send_start(ipair + 1) - 1 tag = inz - self%send_start(ipair) iinp = self%send_index(inz) - call MPI_Isend(Ginp(:,iinp), ncount, NUMBERMPI_TYPE, rank, tag, self%comm, sreq(inz), ierr) #ifdef DEBUG write(*, '(9(a,i0))') "send local _TYPE-element ",iinp,"@",myrank," with tag ",tag," to rank ",rank #endif + call MPI_Isend(Ginp(:,iinp), ncount, NUMBERMPI_TYPE, rank, tag, self%comm, sreq(inz), ierr) enddo ! inz do inz = self%recv_start(ipair), self%recv_start(ipair + 1) - 1 tag = inz - self%recv_start(ipair) iout = self%recv_index(inz) - call MPI_Irecv(Gout(:,iout), ncount, NUMBERMPI_TYPE, rank, tag, self%comm, rreq(inz), ierr) #ifdef DEBUG write(*, '(9(a,i0))') "I (rank ",myrank,") want to receive a _TYPE-element with tag ",tag," from rank ",rank #endif + call MPI_Irecv(Gout(:,iout), ncount, NUMBERMPI_TYPE, rank, tag, self%comm, rreq(inz), ierr) enddo ! inz else ! rank /= myrank @@ -128,7 +135,7 @@ module two_sided_comm_TYPE_mod write(*, '(9(a,i0))') "copy local _TYPE-element ",iinp,"@",myrank," locally" #endif enddo ! inz - + endif ! rank /= myrank enddo ! ipair diff --git a/source/KKRnano/source/read_formatted_mod.F90 b/source/KKRnano/source/read_formatted_mod.F90 index 9071135bf174bc74052bb70eebc399c6fed8b000..aef3af8e80a7bcd6af433d7d06cd7eda0f5df872 100644 --- a/source/KKRnano/source/read_formatted_mod.F90 +++ b/source/KKRnano/source/read_formatted_mod.F90 @@ -179,7 +179,7 @@ module read_formatted_mod blocks%vins = 0.d0 lm1 = 2 - do lm = 2, sb%lmpot + do lm = 2, sb%lmpot + 1 if (lm1 /= 1) then if (sb%isave == 1) then @@ -192,7 +192,7 @@ module read_formatted_mod if (lm1 > 1) then if (lm1 < 1) die_here("potential file is not formatted correctly, lm ="+lm1+"out of range! Atom#"-atom_id) - if (lm1 > sb%lmpot) die_here("potential file is not formatted correctly, lm ="+lm1-", but lmpot ="+sb%lmpot+" for Atom#"-atom_id) +! if (lm1 > sb%lmpot) die_here("potential file is not formatted correctly, lm ="+lm1-", but lmpot ="+sb%lmpot+" for Atom#"-atom_id) read(unit, fmt="(1p,4d20.13)", iostat=ios) blocks%vins(irmin:sb%irt1p,lm1) if (ios /= 0) die_here("failed to read non-spherical potential array vins(:,"-lm1-")! Atom#"-atom_id) diff --git a/source/KKRnano/source/read_formatted_shapefun_mod.F90 b/source/KKRnano/source/read_formatted_shapefun_mod.F90 index 0e85244c251230759b57ab65d751ddd0f6a3cf0a..fba14cd063010fe4664b4e074b9e207d1b232e4e 100644 --- a/source/KKRnano/source/read_formatted_shapefun_mod.F90 +++ b/source/KKRnano/source/read_formatted_shapefun_mod.F90 @@ -53,7 +53,7 @@ module read_formatted_shapefun_mod integer :: icell double precision :: dummy - read(unit, fmt="(16i5)") sfile%ncell + read(unit, fmt=*) sfile%ncell read(unit, fmt="(4d20.12)") (dummy, icell=1,sfile%ncell) @@ -93,7 +93,7 @@ module read_formatted_shapefun_mod integer :: ifun, lm - read(unit, fmt="(16i5)") shapef%nfu + read(unit, fmt=*) shapef%nfu allocate(shapef%llmsp(shapef%nfu), shapef%thetas(inter%meshn,shapef%nfu)) diff --git a/source/KKRnano/source/shapefun/Voronoi_mod.F90 b/source/KKRnano/source/shapefun/Voronoi_mod.F90 index 8733571fc95a23c00b631b1c8b61c84b3c22f45d..c41e22e83653a54265618ce3bd3a97c00a133fd0 100644 --- a/source/KKRnano/source/shapefun/Voronoi_mod.F90 +++ b/source/KKRnano/source/shapefun/Voronoi_mod.F90 @@ -576,7 +576,10 @@ module Voronoi_mod #ifndef NDEBUG if (sum(abs(p(1:3))) < 1.d-80) die_here('halfspace: a,b,c too small.') #endif - half_space = (p(0)*(p(1)*v(1) + p(2)*v(2) + p(3)*v(3)) <= p(0)*p(0)) +! half_space = (p(0)*(p(1)*v(1) + p(2)*v(2) + p(3)*v(3)) <= p(0)*p(0)) +! reintroduced tolerance value 1.d-16, seems to be necessary for large-scale +! MnGe B20 system (R.Zeller June 2020) + half_space = (p(0)*(p(1)*v(1) + p(2)*v(2) + p(3)*v(3)) <= p(0)*p(0) +1.d-16) endfunction ! halfspace function normal_plane(v1, tau) result(p) diff --git a/source/KKRnano/source/wrappers_mod.F90 b/source/KKRnano/source/wrappers_mod.F90 index 91c6bd14291f5d65537c3c60c268a0214b3c81c2..befda5ce87b0a23694a72b4d85b99872a0ecd883 100644 --- a/source/KKRnano/source/wrappers_mod.F90 +++ b/source/KKRnano/source/wrappers_mod.F90 @@ -91,7 +91,7 @@ use Warnings_mod, only: launch_warning theta_noco,phi_noco,angle_fixed,moment_x,moment_y,moment_z,& 1, & ! ipot=1 den,espv,rho2ns,r2nef, gmatn(:,:,:,1), muorb, & ! just one spin component of gmatn needed - atomdata%potential%lpot,lmaxd,mesh%irmd,chebmesh%irmd_new,iemxd, params%soc) + atomdata%potential%lpot,lmaxd,mesh%irmd,chebmesh%irmd_new,iemxd, params%soc,params%enable_quad_prec) ! calculate correct orbital moment do ispin=1,nspind diff --git a/source/voronoi/maindriver12.f b/source/voronoi/maindriver12.f index afd40002c12e3b05634e8baf9c5cc5e189d27738..e078e05438e2e1dd07befbe353fb33877d8079db 100644 --- a/source/voronoi/maindriver12.f +++ b/source/voronoi/maindriver12.f @@ -120,6 +120,8 @@ c + ZATOM(NTOTD) ! Nuclear charge INTEGER ICC, ! center of cluster for output of GF + ICLS, NAEZ, ! number of atoms in unit cell + + NVAC, ! number of empty cells + + NVAC_IT, + NATYP, ! number of kinds of atoms in unit cell + NCLS, ! number of reference clusters + NEMB, ! number of 'embedding' positions @@ -146,6 +148,8 @@ c & ROUT_ALL(NTOTD), ! Outer cell-radius per atom & DISTNN(NAEZD+NIMPD), ! Distance from cell center to nearest-neighbor cell center (2*RMTHLF) & VOLUME_ALL(NTOTD), ! Volume per atom + & VCENTER_ALL(3,NTOTD), ! Center of the voronoi cells + & VCENTER_SQSUM, & A3_ALL(NFACED,NTOTD), ! A3,B3,C3,D3: Defining the faces per atom & B3_ALL(NFACED,NTOTD), & C3_ALL(NFACED,NTOTD), @@ -227,7 +231,7 @@ c & VOLUMECL(NSHAPED),RWSCL(NSHAPED),RMTCL(NSHAPED) REAL*8 DX(NTOTD),DY(NTOTD),DZ(NTOTD) REAL*8 ROUT,RTEST,DLT,CRAD,RX,RY,RZ,MTRADIUS,VTOT, - & SHAPESHIFT(3,NTOTD) + & SHAPESHIFT(3,NTOTD),VCENTER(3) CHARACTER*256 UIO INTEGER NATOMS,NSITES,NSHAPE ! Number of atoms, sites, shapes INTEGER LMAX,KEYPAN,NPOI,NA,IAT,JAT,ICL,N1A,I2,II,ISITE @@ -270,7 +274,7 @@ c c ----------------------------------------------------------------------- DATA BBOX/2.0d0,2.0d0,3.0d0/ DATA DLT/0.05d0/ ! Parameter for theta-integration (Gauss-Legendre rule). Usually 0.05 - DATA NPOI/125/ ! Total number of shapefunction points + DATA NPOI/555/ ! Total number of shapefunction points DATA NRAD/10/ ! Muffintinization points DATA NMIN/7/ ! Minimum number of points in panel DATA NSMALL/10000/ ! A large number to start (See subr. divpanels) @@ -320,7 +324,7 @@ c CALL READINPUT(BRAVAIS,LCARTESIAN,RBASIS,ABASIS,BBASIS,CBASIS, & DX,DY,DZ, & ALATC,BLATC,CLATC, - & IRNS,NAEZ,NEMB,KAOEZ,IRM,ZATOM,SITEAT, + & IRNS,NAEZ,NVAC,NEMB,KAOEZ,IRM,ZATOM,SITEAT, & INS,KSHAPE, & LMAX,LMMAX,LPOT, & NATYP,NSPIN, @@ -357,6 +361,9 @@ c Rationalise basis vectors X TRIGHT) ENDIF c + DO NVAC_IT = 1,20 +c the number 20 is an empirical value for the number of iterations used +c to update the empty-cell positions CALL CLSGEN_VORONOI(NATYP,NAEZ,NEMB,RR,NR,RBASIS, & KAOEZ,ZATOM,CLS,NCLS, & NACLS,ATOM,EZOA, @@ -364,6 +371,7 @@ c & ZPERIGHT,TLEFT,TRIGHT, & RCLS,RMTHLF,RCUTZ,RCUTXY,LINTERFACE, & ALATC) + CLOSE (8) DISTNN(1:NAEZ) = 2.D0*RMTHLF(1:NAEZ) @@ -529,12 +537,14 @@ c Therefore, sizefac(0) = 1.0 is defined earlier. WRITE(6,*) 'Entering VORONOI12 for atom=',IAT CALL VORONOI12( > NVEC,RVEC,NVERTD,NFACED,WEIGHT0,WEIGHT,TOLVDIST,TOLAREA,TOLHS, - < RMT0,ROUT,VOLUME,NFACE,A3,B3,C3,D3,NVERT,XVERT,YVERT,ZVERT) + < RMT0,ROUT,VOLUME,NFACE,A3,B3,C3,D3,NVERT,XVERT,YVERT,ZVERT, + < VCENTER) c Now store results in atom-dependent array. RMT0_ALL(IAT) = RMT0 ROUT_ALL(IAT) = ROUT VOLUME_ALL(IAT) = VOLUME + VCENTER_ALL(:,IAT) = VCENTER(:) NFACE_ALL(IAT) = NFACE A3_ALL(:,IAT) = A3(:) B3_ALL(:,IAT) = B3(:) @@ -547,6 +557,29 @@ c Now store results in atom-dependent array. 20 ENDDO ! DO 20 IAT = 1,NSITES + + IF(NVAC.GT.0) THEN + OPEN(333,file='empty_cell.dat',form='formatted') + WRITE(6,FMT='(I6,A)') NVAC, + + ' empty cell positions will be updated' + VCENTER_SQSUM = 0.0D0 + DO IAT = 1,NVAC + VCENTER_SQSUM = VCENTER_SQSUM + SQRT(VCENTER_ALL(1,IAT)**2+ + + VCENTER_ALL(2,IAT)**2+VCENTER_ALL(3,IAT)**2) +c an empirical factor 0.2D0 is used to avoid overshooting of the iterations + DO J = 1,3 + VCENTER_ALL(J,IAT) = VCENTER_ALL(J,IAT)*0.2D0 + END DO + RBASIS(:,IAT) = RBASIS(:,IAT) + VCENTER_ALL(:,IAT) + WRITE(6,FMT='(3F16.9)') RBASIS(:,IAT) + WRITE(333,FMT='(3F16.9)') RBASIS(:,IAT) + END DO + WRITE(6,FMT='(F16.9,A)') VCENTER_SQSUM, + + ' is a quality measure for the empty cell positions' + CLOSE(333) + END IF + IF(NVAC.EQ.0.OR.ABS(VCENTER_SQSUM).LT.1.D-6) EXIT + END DO c------------------------------------------------------------------------------- diff --git a/source/voronoi/readinput12.f90 b/source/voronoi/readinput12.f90 index 7a0fe021551af66acee46bc70aa75959c4f16115..e73779ead73adcff5f60ccd00994cdd735832aee 100644 --- a/source/voronoi/readinput12.f90 +++ b/source/voronoi/readinput12.f90 @@ -1,7 +1,7 @@ SUBROUTINE READINPUT(BRAVAIS,LCARTESIAN,RBASIS,ABASIS,BBASIS,CBASIS, & & DX,DY,DZ, & & ALATC,BLATC,CLATC, & - & IRNS,NAEZ,NEMB,KAOEZ,IRM,ZAT,SITEAT, & + & IRNS,NAEZ,NVAC,NEMB,KAOEZ,IRM,ZAT,SITEAT, & & INS,KSHAPE, & & LMAX,LMMAX,LPOT, & & NATYP,NSPIN, & @@ -57,7 +57,7 @@ & KVREL,KWS,KXC,LMAX,LMMAX,LMPOT,LPOT,MD, & & NATYP,NPNT1,NPNT2,NPNT3,NPOL,NSPIN,INDX,IAT INTEGER NMIN,NSMALL,NRAD,NFACELIM,NBR - INTEGER NSTEPS,KMT,NAEZ,NEMB + INTEGER NSTEPS,KMT,NAEZ,NVAC,NEMB INTEGER NINEQ,NEMBZ,NZ,CENTEROFINV(3) REAL*8 ALATC,BLATC,CLATC INTEGER MMIN,MMAX,SINN,SOUT,RIN,ROUT @@ -151,6 +151,13 @@ WRITE(*,*) 'readinput: CARTESIAN=',LCARTESIAN WRITE(111,*) 'CARTESIAN= ',LCARTESIAN + CALL IoInput('NVAC ',UIO,1,7,IER) + IF (IER.EQ.0) THEN + READ (UNIT=UIO,FMT=*) NVAC + WRITE(*,*) 'NVAC=', NVAC + ELSE + NVAC = 0 + ENDIF CALL IoInput('NAEZ ',UIO,1,7,IER) IF (IER.EQ.0) THEN diff --git a/source/voronoi/voronoi12.f b/source/voronoi/voronoi12.f index 4c26d721479e7ae83251b451b7bff0844e9e4bec..35a6b69dd3e611eb9dd7a20d07ebb09be1f255f2 100644 --- a/source/voronoi/voronoi12.f +++ b/source/voronoi/voronoi12.f @@ -1,7 +1,8 @@ c*********************************************************************** SUBROUTINE VORONOI12( > NVEC,RVEC,NVERTMAX,NFACED,WEIGHT0,WEIGHT,TOLVDIST,TOLAREA,TOLHS, - < RMT,ROUT,VOLUME,NFACE,A3,B3,C3,D3,NVERT,XVERT,YVERT,ZVERT) + < RMT,ROUT,VOLUME,NFACE,A3,B3,C3,D3,NVERT,XVERT,YVERT,ZVERT, + < VCENTER) c Given a cluster of atomic positions at RVEC(3,NVEC), this subroutine c returns information about the Voronoi cell around the origin. It is c supposed, of course, that the origin corresponds to an atomic position @@ -73,7 +74,7 @@ c ! and of all others (dimensioned as RVEC). c Output: INTEGER NFACE INTEGER NVERT(*) - REAL*8 VOLUME + REAL*8 VOLUME,VCENTER(3) REAL*8 A3(NFACED),B3(NFACED),C3(NFACED),D3(NFACED) REAL*8 XVERT(NVERTMAX,NFACED),YVERT(NVERTMAX,NFACED), & ZVERT(NVERTMAX,NFACED) @@ -133,6 +134,9 @@ c origin and r1,r2,r3 the vectors of the 3 other vertices. c Algorithm requires that the face is a convex polygon with the c vertices ordered (doesn't matter if they are clock- or anticlockwise). VOLUME = 0.d0 + VCENTER(1) = 0.d0 + VCENTER(2) = 0.d0 + VCENTER(3) = 0.d0 DO IFACE = 1,NFACE X1 = XVERT(1,IFACE) Y1 = YVERT(1,IFACE) @@ -146,6 +150,9 @@ c vertices ordered (doesn't matter if they are clock- or anticlockwise). Y3 = YVERT(IVERT+1,IFACE) Z3 = ZVERT(IVERT+1,IFACE) TETRVOL = X1*(Y2*Z3-Y3*Z2)+X2*(Y3*Z1-Y1*Z3)+X3*(Y1*Z2-Y2*Z1) + VCENTER(1) = VCENTER(1) + 0.25d0*DABS(TETRVOL)*(X1+X2+X3) + VCENTER(2) = VCENTER(2) + 0.25d0*DABS(TETRVOL)*(Y1+Y2+Y3) + VCENTER(3) = VCENTER(3) + 0.25d0*DABS(TETRVOL)*(Z1+Z2+Z3) VOLUME = VOLUME + DABS(TETRVOL) TRIANGLEAREA = 0.5d0 * DSQRT( & ( X1*Y2 + X2*Y3 + X3*Y1 - Y2*X3 - Y3*X1 - Y1*X2)**2 @@ -157,8 +164,12 @@ c vertices ordered (doesn't matter if they are clock- or anticlockwise). ENDDO ENDDO VOLUME = VOLUME/6.D0 + VCENTER(1) = VCENTER(1)/VOLUME + VCENTER(2) = VCENTER(2)/VOLUME + VCENTER(3) = VCENTER(3)/VOLUME WRITE(6,*) ' Polyhedron properties ' + WRITE(6,*) ' Number of faces : ',nface IF (TEST('verb0 ')) THEN diff --git a/tests/gitlab-ci/build_kkrnano.yml b/tests/gitlab-ci/build_kkrnano.yml new file mode 100644 index 0000000000000000000000000000000000000000..93c488f1c13cf363a3895cf8cbfbaaab43f61607 --- /dev/null +++ b/tests/gitlab-ci/build_kkrnano.yml @@ -0,0 +1,21 @@ +build_kkrnano:intel:hybrid: + stage: build_kkrnano + tags: + - docker-executor + script: + # compile code + - cd source/KKRnano/source && mkdir -p build + - make -j4 PLATFORM=ifort SMP=openmp + - cp kkr.exe ../regtests/kkr.exe + artifacts: + paths: + - source/KKRnano/regtests/kkr.exe + expire_in: 1 day + only: + - schedules + - triggers + - web + - master + - develop + - kkrnano-activate-tests + - kkrnano-chebyshev-tfQMRgpu diff --git a/tests/gitlab-ci/run_kkrnano.yml b/tests/gitlab-ci/run_kkrnano.yml new file mode 100644 index 0000000000000000000000000000000000000000..27b304b87298821a954425f976a7e1961dd174da --- /dev/null +++ b/tests/gitlab-ci/run_kkrnano.yml @@ -0,0 +1,121 @@ +run_kkrnano:intel:Cu1: + stage: run_kkrnano + tags: + - docker-executor + script: + - cd source/KKRnano/regtests + - mkdir -p test_Cu1; cd test_Cu1; ln -s ../* . + - ls -la + - ls -la .. + - python3 ./tests.py Test_copper.test_Cu1_lmax + artifacts: + paths: + - source/KKRnano/regtests/test_Cu1 + expire_in: 1 day + only: + - schedules + - triggers + - web + - master + - develop + - kkrnano-chebyshev-tfQMRgpu + +run_kkrnano:intel:Cu4: + stage: run_kkrnano + tags: + - docker-executor + script: + - cd source/KKRnano/regtests + - mkdir -p test_Cu4; cd test_Cu4; ln -s ../* . + - python3 ./tests.py Test_copper.test_Cu4_lmax + artifacts: + paths: + - source/KKRnano/regtests/test_Cu4 + expire_in: 1 day + only: + - schedules + - triggers + - web + - master + - develop + - kkrnano-chebyshev-tfQMRgpu + +run_kkrnano:intel:GaN: + stage: run_kkrnano + tags: + - docker-executor + script: + - cd source/KKRnano/regtests + - mkdir -p test_GaN; cd test_GaN; ln -s ../* . + - python3 ./tests.py Test_semiconductors.test_GaN + artifacts: + paths: + - source/KKRnano/regtests/test_GaN + expire_in: 1 day + only: + - schedules + - triggers + - web + - master + - develop + - kkrnano-chebyshev-tfQMRgpu + +run_kkrnano:intel:Si: + stage: run_kkrnano + tags: + - docker-executor + script: + - cd source/KKRnano/regtests + - mkdir -p test_Si; cd test_Si; ln -s ../* . + - python3 ./tests.py Test_semiconductors.test_Si + artifacts: + paths: + - source/KKRnano/regtests/test_Si + expire_in: 1 day + only: + - schedules + - triggers + - web + - master + - develop + - kkrnano-chebyshev-tfQMRgpu + +run_kkrnano:intel:ZnO: + stage: run_kkrnano + tags: + - docker-executor + script: + - cd source/KKRnano/regtests + - mkdir -p test_ZnO; cd test_ZnO; ln -s ../* . + - python3 ./tests.py Test_semiconductors.test_ZnO + artifacts: + paths: + - source/KKRnano/regtests/test_ZnO + expire_in: 1 day + only: + - schedules + - triggers + - web + - master + - develop + - kkrnano-chebyshev-tfQMRgpu + +run_kkrnano:intel:MnGeB20: + stage: run_kkrnano + tags: + - docker-executor + script: + - cd source/KKRnano/regtests + - mkdir -p test_MnGeB20; cd test_MnGeB20; ln -s ../* . + - python3 ./tests.py Test_nocosocmaterials.test_MnGeB20 + artifacts: + paths: + - source/KKRnano/regtests/test_MnGeB20 + expire_in: 1 day + only: + - schedules + - triggers + - web + - master + - develop + - kkrnano-chebyshev-tfQMRgpu