So, I’ve had a chance to sift through the Nikkor 100-400mm zoom distortion correction. Here’s what exiftool spits out for the distortion coefficients:
glenn@bena:~/Photography/Lens_Correction/Nikon Z Lens Correction/2024-01-19 Nikon Z Lens Collection/NIKKOR_100-400_4.5-5.6$ for F in *.NEF; do exiftool -csv -FocalLength -*distortioncoefficient3 -*distortioncoefficient2 -*distortioncoefficient1 $F; done
SourceFile,FocalLength,RadialDistortionCoefficient3,RadialDistortionCoefficient2,RadialDistortionCoefficient1
_DSC1219.NEF,100.0 mm,0.00430,-0.00120,0.00239
_DSC1220.NEF,135.0 mm,0.01387,-0.00137,0.00286
_DSC1221.NEF,200.0 mm,0.02062,-0.00059,0.00246
_DSC1222.NEF,310.0 mm,0.02291,-0.00036,0.00210
_DSC1223.NEF,400.0 mm,0.02360,-0.00014,0.00195
(edited the program output for clarity)
Of note, these coefficients are pretty small, not a lot of correction going on. Indeed, when I convert the NEFs to DNGs and pull out the Adobe WarpRetilinear coefficients, some all of the focal lengths only have chromatic abberation correction:
glenn@bena:~/Photography/Lens_Correction/Nikon Z Lens Correction/2024-01-19 Nikon Z Lens Collection/NIKKOR_100-400_4.5-5.6$ for F in *.dng; do exiftool -b -opcodelist3 $F | ../../opcode3a ; done
Warning: [Minor] Not decoding some large array(s). Ignore minor errors to decode - _DSC1219.dng
number of opcodes: 1
opcode: 1, dngspec: 1030000, flags: 0, numbytes: 164
operation: WarpReticlinear
number of coefficient sets: 3
kr0:1.000154, kr1:-0.000159, kr2:0.000023, kr3:-0.000005, kt0:0.000000, kt1:0.000000
kr0:1.000000, kr1:0.000000, kr2:0.000000, kr3:0.000000, kt0:0.000000, kt1:0.000000
kr0:1.000162, kr1:0.000203, kr2:-0.000109, kr3:0.000025, kt0:0.000000, kt1:0.000000
cx:0.501197, cy:0.505884
Warning: [Minor] Not decoding some large array(s). Ignore minor errors to decode - _DSC1220.dng
number of opcodes: 1
opcode: 1, dngspec: 1030000, flags: 0, numbytes: 164
operation: WarpReticlinear
number of coefficient sets: 3
kr0:1.000168, kr1:-0.000224, kr2:0.000118, kr3:-0.000027, kt0:0.000000, kt1:0.000000
kr0:1.000000, kr1:0.000000, kr2:0.000000, kr3:0.000000, kt0:0.000000, kt1:0.000000
kr0:1.000158, kr1:-0.000031, kr2:0.000026, kr3:-0.000006, kt0:0.000000, kt1:0.000000
cx:0.501168, cy:0.505902
Warning: [Minor] Not decoding some large array(s). Ignore minor errors to decode - _DSC1221.dng
number of opcodes: 1
opcode: 1, dngspec: 1030000, flags: 0, numbytes: 164
operation: WarpReticlinear
number of coefficient sets: 3
kr0:1.000097, kr1:-0.000151, kr2:0.000275, kr3:-0.000064, kt0:0.000000, kt1:0.000000
kr0:1.000000, kr1:0.000000, kr2:0.000000, kr3:0.000000, kt0:0.000000, kt1:0.000000
kr0:1.000040, kr1:-0.000037, kr2:-0.000147, kr3:0.000034, kt0:0.000000, kt1:0.000000
cx:0.501166, cy:0.505904
Warning: [Minor] Not decoding some large array(s). Ignore minor errors to decode - _DSC1222.dng
number of opcodes: 1
opcode: 1, dngspec: 1030000, flags: 0, numbytes: 164
operation: WarpReticlinear
number of coefficient sets: 3
kr0:1.000121, kr1:0.000056, kr2:0.000086, kr3:-0.000020, kt0:0.000000, kt1:0.000000
kr0:1.000000, kr1:0.000000, kr2:0.000000, kr3:0.000000, kt0:0.000000, kt1:0.000000
kr0:0.999774, kr1:-0.000134, kr2:-0.000130, kr3:0.000030, kt0:0.000000, kt1:0.000000
cx:0.501135, cy:0.505907
Warning: [Minor] Not decoding some large array(s). Ignore minor errors to decode - _DSC1223.dng
number of opcodes: 1
opcode: 1, dngspec: 1030000, flags: 0, numbytes: 164
operation: WarpReticlinear
number of coefficient sets: 3
kr0:1.000066, kr1:-0.000025, kr2:0.000181, kr3:-0.000042, kt0:0.000000, kt1:0.000000
kr0:1.000000, kr1:0.000000, kr2:0.000000, kr3:0.000000, kt0:0.000000, kt1:0.000000
kr0:0.999701, kr1:-0.000062, kr2:-0.000204, kr3:0.000047, kt0:0.000000, kt1:0.000000
cx:0.501138, cy:0.505884
(Note: exiftool doesn’t decode the DNG OpCodeList paramters, so I feed its binary output to a C++ program I wrote to do that) Each .DNG contains a three-plane WarpRetilinear correction, each plane corresponding to a color channel, R, G, and B. Note that none of them have a green channel (middle entry) correction, the parameters for that plane are 1,0,0,0, or no-op. Based on this and some other (lack of) relationships between NEF and DNG coefficients, I think Adobe is putting their own corrections in the DNGs, instead of transferring the NEF data.
Regarding the k0 parameter, Nikon doesn’t provide it in their metadata, at least not in what exiftool extracts. So, I’ve been messing with how to construct the parameter value from image data, a daunting task for a fellow who only took four math courses in his three university degrees 
You can easily do such for Lensfun’s PTLens model:
d = 1 - (a+b+c)
Where a, b, and c are the PTLens correction coefficients and d is their k0 equivalent. No such fortune for Adobe, the powers in the model function don’t (at least to me, bear-of-little-brain) offer a straightforward equation.
Thinking it through, what d and k0 do in each model is scaling of the warped image. Using that assertion, I came to the conclusion that I could determine the scale needed for a particular image and its correction coefficients by computing the normalized (0.0-1.0) correction needed for the maximum distance-from-the-center in the width and height dimensions and use that to determine the scale factor. So, I wrote a C++ function to compute that:
float PicProcessorLensDistortion::adobe_k0(float k1, float k2, float k3)
{
int w = dib->getWidth();
int h = dib->getHeight();
float normR = sqrt((w/2)*(w/2) + (h/2)*(h/2));
float wR = (w/2) / normR;
float hR = (h/2) / normR;
float wD = (k1*pow(wR,2) + k2*pow(wR,4) + k3*pow(wR,6)) * wR;
float hD = (k1*pow(hR,2) + k2*pow(hR,4) + k3*pow(hR,6)) * hR;
if (wD < hD)
return 1-(wD/2);
else
return 1-(hD/2);
}
With the couple of coefficient sets I’ve tested, it seems to yield a k0 from the Nikon data roughly equivalent to the k0 in the corresponding DNG data.
Anyway, comments and criticisms welcome…
Edit: I must have fat-fingered something earlier, looking at the distortion function I came to the realization that the maximum normalized radius, 1, would just take the powers out of the equation and leave it with 1-(k1+k2+k3). Freaking math genius… So, I tried 1-(k1+k2+k3)/2, and it gives a decent scaling number. Need to inspect the edges closer to make sure it takes out all of the warped edge…
Edit2: Looking at the pasts posts, I need to give a shout-out to @paolod, who really put me on the correct track looking into this.