#!/usr/bin/env perl # Calculate the self-energy and the spectral function via the self-energy trick # General approach, for QS symmetry type, for the 2x2 matrix case # Rok Zitko, rok.zitko@ijs.si, Oct 2008, June 2012, May 2019 use warnings; use strict; use Math::Complex; my @omega = readcol("c-imG-11.dat", 1); my @imG11 = readcol("c-imG-11.dat", 2); my @reG11 = readcol("c-reG-11.dat", 2); my @imF11 = readcol("c-imF-11.dat", 2); my @reF11 = readcol("c-reF-11.dat", 2); my @imG22 = readcol("c-imG-22.dat", 2); my @reG22 = readcol("c-reG-22.dat", 2); my @imF22 = readcol("c-imF-22.dat", 2); my @reF22 = readcol("c-reF-22.dat", 2); my @imG12 = readcol("c-imG-12.dat", 2); my @reG12 = readcol("c-reG-12.dat", 2); my @imF12 = readcol("c-imF-12.dat", 2); my @reF12 = readcol("c-reF-12.dat", 2); my @imG21 = readcol("c-imG-21.dat", 2); my @reG21 = readcol("c-reG-21.dat", 2); my @imF21 = readcol("c-imF-21.dat", 2); my @reF21 = readcol("c-reF-21.dat", 2); my @imdelta1 = readcol("Delta-1.dat", 2); # not prefixed! my @redelta1 = readcol("Delta-1-re.dat", 2); my @imdelta2 = readcol("Delta-2.dat", 2); # not prefixed! my @redelta2 = readcol("Delta-2-re.dat", 2); my $selffn11 = "c-self-11.dat"; open(SELF11, ">$selffn11") or die "Can't open $selffn11 for writing, stopped"; my $imsigma11 = "imsigma-11.dat"; open(IM11, ">$imsigma11") or die "Can't open $imsigma11 for writing, stopped"; my $resigma11 = "resigma-11.dat"; open(RE11, ">$resigma11") or die "Can't open $resigma11 for writing, stopped"; my $selffn22 = "c-self-22.dat"; open(SELF22, ">$selffn22") or die "Can't open $selffn22 for writing, stopped"; my $imsigma22 = "imsigma-22.dat"; open(IM22, ">$imsigma22") or die "Can't open $imsigma22 for writing, stopped"; my $resigma22 = "resigma-22.dat"; open(RE22, ">$resigma22") or die "Can't open $resigma22 for writing, stopped"; # my $pi = pi(); my $len = @omega; for (my $i = 0; $i < $len; $i++) { my $o = $omega[$i]; # Up to a factor of -pi, which however cancels out! my $G11 = $reG11[$i] + i * $imG11[$i]; my $F11 = $reF11[$i] + i * $imF11[$i]; my $G22 = $reG22[$i] + i * $imG22[$i]; my $F22 = $reF22[$i] + i * $imF22[$i]; my $G12 = $reG12[$i] + i * $imG12[$i]; my $F12 = $reF12[$i] + i * $imF12[$i]; my $G21 = $reG21[$i] + i * $imG21[$i]; my $F21 = $reF21[$i] + i * $imF21[$i]; my $det = $G11 * $G22 - $G12 * $G21; my $sigma11 = -($F12 * $G21 - $F11 * $G22)/$det; my $sigma12 = ($F12 * $G11 - $F11 * $G12)/$det; my $sigma21 = -($F22 * $G21 - $F21 * $G22)/$det; my $sigma22 = ($F22 * $G11 - $F21 * $G12)/$det; my $delta1 = i * $imdelta1[$i] + $redelta1[$i]; my $delta2 = i * $imdelta2[$i] + $redelta2[$i]; my $m11 = $o + $delta1 - $sigma11; my $m12 = -$sigma12; my $m21 = -$sigma21; my $m22 = $o + $delta2 - $sigma22; my $detm = $m11 * $m22 - $m12 * $m21; my $gf11 = $m22/$detm; my $gf12 = -$m12/$detm; my $gf21 = -$m21/$detm; my $gf22 = $m11/$detm; my $aw11 = -1.0/pi * Im($gf11); print SELF11 "$o $aw11\n"; my $aw22 = -1.0/pi * Im($gf22); print SELF22 "$o $aw22\n"; my $re11 = Re($sigma11); my $im11 = Im($sigma11); print IM11 "$o $im11\n"; print RE11 "$o $re11\n"; my $re22 = Re($sigma22); my $im22 = Im($sigma22); print IM22 "$o $im22\n"; print RE22 "$o $re22\n"; } # Read a column from a file sub readcol { my ($filename, $column) = @_; my @l; open(F, "<$filename") or die "Can't open $filename for reading, stopped"; while () { chomp; my $x = (split)[$column-1]; push(@l, $x); } close(F); @l };